sqlite第三方类库FMDB的使用

       FMDB是ios平台下解析sqlite的第三方数据库管理框架,使用非常方便,而且提供了多线程安全的数据库操作,相比coredata来说更加灵活和轻量级。

        fmdb主要有三个类别:

        fmdatabase:用来执行sql语句;

       fmresultset:用来使用fmdatabase执行查询后的结果集合

       fmdatabasequeue:用来在多线程中查询和更新数据,它是线程安全的。

       需要注意的是,在iOS环境下,只有document directory 是可以进行读写的。

fmdb的使用

1.在新建的项目中,导入libsqlite3的动态数据库:

注:(在Building Phases中的Link Binary WithLibraries中添加)

2.加入第三方框架fmdb中的这些主要文件:

  

3.在代码中建立一个数据库,并指定文件路径:

 1     //指定沙盒路径
 2     NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
 3     //在指定沙盒路径下添加sqlite文件
 4     NSString *filepath = [path stringByAppendingPathComponent:@"moxue.sqlite"];
 5     //在指定path路径下创建数据库
 6     FMDatabase *db = [FMDatabase databaseWithPath:filepath];
 7     //查看是否打开成功
 8     if (![db open]) {
 9         return;
10     }else{
11         NSLog(@"打开成功");
12     }

4.在代码中添加列表和列表属性:(表格的参数不能是id(大小写都不可以),否则会出现创建表格失败,因为表格在创建时,表格会自动生成一个id属性)

1 //在数据库中创建一个列表,并添加列表属性
2     BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS data(id INTEGER PRIMARY KEY AUTOINCREMENT,Title TEXT,date TEXT,Context TEXT,Url TEXT)"];
3     if (result) {
4         NSLog(@"创建data表成功");
5     }else{
6         NSLog(@"创建data表失败");
7     }

注意:(表名不能是变量),否则会创建表格失败或为空,正确的写法为:

NSString *sql = [NSString stringWithFormat:@"select * from %@", tableName];
FMResultSet *rs = [db executeQuery:sql];

5.在列表中插入数据:

1   //插入数据
2     BOOL res = [db executeUpdate:@"INSERT INTO data (Title,date,Context,Url) VALUES(?,?,?,?)",@"墨雪",@"2015-10-11",@"我的表格",@"我的Url"];
3     BOOL res1 = [db executeUpdate:@"INSERT INTO data (Title,date,Context,Url) VALUES(?,?,?,?)",@"刘庆",@"2015-10-10",@"刘庆的表格",@"刘庆的Url"];
4     if (res1) {
5         NSLog(@"插入data成功");
6     }else{
7         NSLog(@"插入data表失败");
8     }

6.在类表中删除数据或者列表:

1 BOOL dele = [db executeUpdate:@"DROP TABLE IF EXISTS data"];
2     BOOL dele1 = [db executeUpdate:@"delete from data where Title = '墨雪'"];
3     if (dele) {
4         NSLog(@"删除数据成功");
5     }else{
6         NSLog(@"删除数据失败");
7     }

7.在列表中修改数据:

1  //修改数据
2     BOOL UPDATE = [db executeUpdate:@"update data SET Title = '哈哈' WHERE id = 1" ];
3     if (UPDATE) {
4         NSLog(@"修改成功");
5     }else{
6         NSLog(@"修改失败");
7     }

8.在列表中查询数据:

1  //查询数据
2     FMResultSet *RS = [db executeQuery:@"SELECT Title from data"];
3     while ([RS next]) {
4         NSString *name = [RS stringForColumn:@"Title"];
5         NSLog(@"%@",name);
6     }

 9. 如果应用中使用了多线程操作数据库,那么就需要使用FMDatabaseQueue来保证线程安全了。 应用中不可在多个线程中共同使用一个FMDatabase对象操作数据库,这样会引起数据库数据混乱。 为了多线程操作数据库安全,FMDB使用了FMDatabaseQueue,使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。 在闭包中操作数据库,而不直接参与FMDatabase的管理。

 1  FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:filepath];
 2     dispatch_queue_t myq1 = dispatch_queue_create("myqueue1", nil);
 3     dispatch_async(myq1, ^{
 4        [queue inDatabase:^(FMDatabase *db) {
 5            FMResultSet *RS = [db executeQuery:@"SELECT Title from data"];
//NSString *address = [db stringForQuery:@"SELECT Address FROM PersonList WHERE Name = ?",@"John”];
6 while ([RS next]) { 7 NSString *name = [RS stringForColumn:@"Title"]; 8 NSLog(@"%@",name); 9 } 10 11 }]; 12 });

10.关闭数据库

 1 [db close];  

11.另外 FMResultSet 还提供了很多方法来获得所需的格式的值:

    intForColumn:
    longForColumn:
    longLongIntForColumn:
    boolForColumn:
    doubleForColumn:
    stringForColumn:
    dataForColumn:
    dataNoCopyForColumn:
    UTF8StringForColumnIndex:
    objectForColumn:
12.fmda在存储的过程中,传给execute方法的参数必须是NSObject,如果是int,float等需要先将数据进行包装,否则传过去的数据要么为null要么导致程序crash。正确的写法应该是:
FMResultSet *rs = [db executeQuery:sql, [NSNumber numberWithLong:mynum];
原文地址:https://www.cnblogs.com/moxuexiaotong/p/4870438.html