FMDB的简单使用(一)
第一次使用FMDB这个库,所以在这做一点备注。在这之前我也尝试使用coreData。尽管在使用之前已经做好心理准备,但是也被他的复杂步骤虐到了。主要是对C的一知半解。。。
API理解
-
FMDatabase
这个最直接的理解就是代表一个SQLite数据库。//引用官方代码 NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:@"tmp.db"]; FMDatabase *db = [FMDatabase databaseWithPath:path];
这里要注意的是FMDB会自动判断数据库是否存在,如果不存在就自动创建爱你。就是说我们不必通过NSFileManager 判断sqlite文件是否存在,再创建数据库。
-
FMResultSet
表示在FMDatabase查询的结果集FMResultSet *sresults = [db executeQuery:@"SELECT COUNT(*) FROM myTable"]; while ([results next]) { ScoreModel *model = [ScoreModel new]; model.score = [results intForColumn:@"score"]; model.time = [results stringForColumn:@"time"]; }
在尝试访问查询中返回的值之前,您必须始终调用 - [FMResultSet next],即使 您只希望得到一个值(直接就是官方翻译了。。)
对于查询到的数据,通过以下的AIP转换为OC的数据类型intForColumn:
longForColumn:
longLongIntForColumn:
boolForColumn:
doubleForColumn:
stringForColumn:
dateForColumn:
dataForColumn:
dataNoCopyForColumn:
UTF8StringForColumn:
objectForColumn: -
FMDatabaseQueue
如果你想在多个线程上执行查询和更新,你会想要使用这个类。它在下面的“线程安全”一节中有描述。(就是说你要多线程,异步查询请用这个类)FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];
关于这个类,由于这次使用得东西比较简单,所以我并没有使用这个类。但是,我看过别人封装的工具类,以及结合GitHub上的文档,记录一下自己的理解吧(如果有错误的地方请指正)
1.关于上面该类的创建方法,有一点我是不确实是否会自动检测数据库是否存在的,但是GitHub上只给出这一句,按照我的理解应该和FMDatabase一样,如果文件不存在,就自动创建(有待验证)
2.FMDatabaseQueue 采用Block的方式进行数据库的操作[queue inTransaction:^(FMDatabase *db, BOOL *rollback) { [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @1]; [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @2]; [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @3]; if (whoopsSomethingWrongHappened) { *rollback = YES; return; } // etc ... }];
3.从上面的方法中可以看出,FMDatabaseQueue会为我们自动创建数据库,并对数据库进行管理(就是说我们不用手动对数据库进行[db open]、 [db close])
这里要说明的是,我们直接操作FMDatabase的时候 记得[db open]后再对数据进行操作,当我们完成查询或者更新操作后,执行[db close] 释放资源
自己遇到的坑
-
数据库的创建
我自己在创建数据库路径的时候发生一个比较尴尬的地方//正确 NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true) firstObject]; NSString *filePath = [documentPath stringByAppendingPathComponent:@"score.sqlite"];
//错误 NSString *filePath = [documentPath stringByAppendingString:@"score.sqlite"];
路径拼接错误!!!!
-
数据插入
BOOL success = [_db executeUpdate:@"INSERT INTO scores(score,time) values(?,?)",@(model.score),model.time];
这里要注意的地方时,传值的时候一定要转换为对象,否则FMDB在运行的时候报错(错误处理能力强的别喷我)
-
数据库打开关闭
上文也有提及到,直接操作FMDatabase的时候,一定要记得 判断 数据库是否已经打开,在查询或者更新执行完毕后请执行 [db close]以释放资源 -
查询和更新
任何不是SELECT语句的SQL语句都有资格作为更新。这包括CREATE,UPDATE,INSERT,ALTER,COMMIT,BEGIN,DETACH,DELETE,DROP,END,EXPLAIN,VACUUM和REPLACE语句(还有更多)。基本上,如果你的SQL语句不是以SELECT开头的,它是一个更新语句
executeQuery --查询
executeUpdate --更新
以上是本人自己的一点踩坑记录,如果有错误的地方请指正