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/
原文地址:https://www.cnblogs.com/liuw-flexi/p/7527221.html