• FMDB复习


    //  colum/列/字段
    //  row/行/记录
    //  主键的作用是唯一标识一条记录
    //  sql语句注意:不区分大小写,以分号结束(不要分号也行?)

    //  如果增加字段,可能要指定数据类型,SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型。

    http://www.cnblogs.com/shenliang123/archive/2012/04/07/2435908.html

     FMDB框架的3大核心类:

    1.FMDatabase
    一个FMDatabase对象就代表一个单独的SQLite数据库
    用来执行SQL语句
    2.FMResultSet
    使用FMDatabase执行查询后的结果集
    3.FMDatabaseQueue
    用于在多线程中执行多个查询或更新,它是线程安全的

    先声明两个必须变量:

    {
        NSString *path; //数据库的存储路径
    }
    @property (nonatomic,strong)FMDatabase *dataBase;

    1. 创建数据库

    //1.创建一个数据库文件存放的位置路径
        path=[NSHomeDirectory() stringByAppendingString:@"/Documents/users.db"];
    //2.创建FMDatabase对象 并用数据库文件路径初始化 _dataBase=[FMDatabase databaseWithPath:path];
    //3.打开数据库 if([_dataBase open]){ NSLog(@"数据库成功打开"); }else { NSLog(@"数据库打开失败"); }
    //4.关闭数据库 [_dataBase close]; // 为什么要关闭数据库? // 注意:每一次对数据库操作(增删改查)的时候,重新打开数据库,然后关闭,以免数据库,一直保持打开状态,造成不必要的资源消耗

    2. 创建表

        NSString *sql=@"CREATE TABLE if not exists users (id integer primary key autoincrement,name VARCHAR(20),age VARCHAR(10));";
        // sql语句为什么一般都用大写?
        // 在iOS开发里面,为了区别sql的关键字,与表名或者列名,以及变量名区分,sql 语句通常都是用大写来标示
        // 如果id设置为自动增长的话,那么把表中的数据删除后,重新插入新的数据,id的编号不是从0开始,而是接着之前的id进行编号。PRIMARY KEY AUTOINCREMENT, 也就是这句话。
        
        //1.打开数据库
        if ([_dataBase open]) {
            //2.执行sql语句
            [_dataBase executeUpdate:sql];
        }else{
            NSLog(@"数据库打开失败");
        }
        //3.关闭数据库
        [_dataBase close];

    3. 插入数据

        NSString *her=@"张三";
        NSString *sql=@"INSERT INTO users (name = ?,age = ?);";
        
        // NSString *sql2=@"INSERT INTO users (name,age) VALUES (?,?);";
        // executeUpdateWithFormat : 不确定的参数用%@、%d等来占位
        //1.
        if([_dataBase open]){
            //2. 插入单条数据
            [_dataBase executeUpdate:sql];
            [_dataBase executeUpdateWithFormat:@"INSERT INTO users (name,age) VALUES (%@,%d);",her,24];
            
            //多次插入
           for(int i=0;i<1000;i++){
               [_dataBase executeUpdateWithFormat:@"INSERT INTO users (name,age) VALUES (%@,%d);",@"刘亦菲",24+i];
            }
        }else{
            NSLog(@"打开数据库失败");
        }
    
        //3.
        [_dataBase close];

    4. 删除数据

        NSString *sql=@"DELETE FROM users WHERE name = '范冰冰';";
        //1.
        if([_dataBase open]){
            //2.
            [_dataBase executeUpdate:sql];
        }else {
            NSLog(@"数据库打开失败");
        }
        //3.
        [_dataBase close];
    // 删除user表数据 字段还在
    FMDatabase *db = [FMDatabase databaseWithPath:self.dbPath];
        if ([db open]) {
            NSString *sql = @"delete from user";
            BOOL res = [db executeUpdate:sql];
            if (!res) {
                NSLog(@"error to delete db data");
            } else {
                NSLog(@"success to delete db data");
             
            }
            [db close];
        }

    5. 修改数据

        NSString *sql=@"UPDATE users SET name = ? WHERE id > 1;";
        //1.
        if ([_dataBase open]) {
            //2.
            [_dataBase executeUpdate:sql,@"杨颖"];
            
        }else{
        
            NSLog(@"数据库打开失败");
            
        }
        //3.
        [_dataBase close];

    如果是升级,可能要增加字段,注意删除字段是不支持的。增加字段可以这样:

    NSString *sql=@"ALTER TABLE users ADD COLUMN sex bit"; //增加sex字段

    增加了某一列,该列不能删除,数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

    6. 查询数据

    NSString *sql=@"SELECT * FROM users";
    //NSString *sql=@"SELECT * FROM users WHERE id > ?;";
    //1.
        if ([_dataBase open]) {
            
            //2.
            // 查询语句查询到的是一个集合,
            FMResultSet *set=[_dataBase executeQuery:sql];
            
            // 遍历查询到的结果集合
            while ([set next]) {
      
                //NSInteger ID=[set intForColumn:@"id"];
                NSString *name=[set stringForColumn:@"name"];
                NSString *age=[set stringForColumn:@"age"];
                NSLog(@"name:%@ age:%@",name,age);
                
            }
        }else{
        
            NSLog(@"数据库打开失败");
        }
        //3.
        [_dataBase close];

    分页查询:

    NSString *sql=@"SELECT * FROM users ORDER BY age DESC LIMIT 0,5;";
    //ORDER BY age DESC 先降序
    //LIMIT 0,5  跳过0条记录,取5条记录

    几个简单的基本的sql语句

    选择:select * from table1 where 范围
    插入:insert into table1(field1,field2) values(value1,value2)  -- field代表字段
    删除:delete from table1 where 范围
    更新:update table1 set field1=value1 where 范围
    查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count as totalcount from table1
    求和:select sum(field1) as sumvalue from table1
    平均:select avg(field1) as avgvalue from table1
    最大:select max(field1) as maxvalue from table1
    最小:select min(field1) as minvalue from table1

    多线程安全

    // 多线程
    - (void)multithread {
        NSLog(@"%s", __func__);
        
        FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:self.dbPath];
        dispatch_queue_t q1 = dispatch_queue_create("queue1", NULL);
        dispatch_queue_t q2 = dispatch_queue_create("queue2", NULL);
        
        dispatch_async(q1, ^{
            for (int i = 0; i < 100; ++i) {
                [queue inDatabase:^(FMDatabase *db) {
                    NSString *sql = @"insert into user (name, password) values(?, ?) ";
                    NSString *name = [NSString stringWithFormat:@"queue111 %d", i];
                    BOOL res = [db executeUpdate:sql, name, @"boy"];
                    if (!res) {
                        NSLog(@"error to add db data: %@", name);
                    } else {
                        NSLog(@"success to add db data: %@", name);
                    }
                }];
            }
        });
        
        dispatch_async(q2, ^{
            for (int i = 0; i < 100; ++i) {
                [queue inDatabase:^(FMDatabase *db) {
                    NSString *sql = @"insert into user (name, password) values(?, ?) ";
                    NSString *name = [NSString stringWithFormat:@"queue222 %d", i];
                    BOOL res = [db executeUpdate:sql, name, @"boy"];
                    if (!res) {
                        NSLog(@"error to add db data: %@", name);
                    } else {
                        NSLog(@"success to add db data: %@", name);
                    }
                }];
            }
        });
    }
    此文仅为鄙人学习笔记之用,朋友你来了,如有不明白或者建议又或者想给我指点一二,请私信我。liuw_flexi@163.com/QQ群:582039935. 我的gitHub: (学习代码都在gitHub) https://github.com/nwgdegitHub/
  • 相关阅读:
    量化平台的发展转
    jmeter全面总结8jmeter实战
    月见笔谈【一】——关于悲剧
    为什么要不断接触和学习新技术之我见
    WPF后台动态调用样式文件
    WPF后台动态添加TabItem并设置样式
    SQL查询SQLSERVER数据库中的临时表结构脚本
    防抖功能的实现
    项目中自定义进度条的实现
    vue3 请求响应拦截
  • 原文地址:https://www.cnblogs.com/liuw-flexi/p/7527221.html
Copyright © 2020-2023  润新知