两种都行,FMDB会在编译的时候知道你是用的哪一种,然后进行相应处理。
使用方法
FMDB有三个主要的类
2.FMResultSet – 表示FMDatabase执行查询后结果集
3.FMDatabaseQueue – 如果你想在多线程中执行多个查询或更新,你应该使用该类。这是线程安全的。
数据库创建
- FMDatabase*db=[FMDatabasedatabaseWithPath:@"/tmp/tmp.db"];
打开数据库
执行更新
一切不是SELECT命令的命令都视为更新。这包括 CREATE,UPDATE,INSERT,ALTER,COMMIT,BEGIN,DETACH,DELETE,DROP,END,EXPLAIN,VACUUM,and REPLACE (等)。
简单来说,只要不是以SELECT开头的命令都是UPDATE命令。
执行查询
执行查询时,如果成功返回FMResultSet对象, 错误返回nil. 与执行更新相当,支持使用 NSError**参数。同时,你也可以使用 -lastErrorCode和-lastErrorMessage获知错误信息。
为了遍历查询结果,你可以使用while循环。你还需要知道怎么跳到下一个记录。使用FMDB,很简单实现,就像这样:
FMResultSet 提供了很多方法来获得所需的格式的值:
intForColumn:
longForColumn:
longLongIntForColumn:
boolForColumn:
doubleForColumn:
stringForColumn:
dataForColumn:
datanoCopyForColumn:
UTF8StringForColumnIndex:
objectForColumn:
[db close];
事务
FMDatabase是支持事务的。
数据净化(数据格式化)
使用FMDB,插入数据前,你不要花时间审查你的数据。你可以使用标准的sqlite数据绑定语法。
sqlite会识别 “?” 为一个输入的点位符, 这样的执行会接受一个可变参数(或者表示为其他参数,如NSArray,NSDictionary,或va_list等),会正确为您转义。
你也可以选择使用命名参数语法。
而且,代码不能这么写(为什么?想想吧。)
你应该:
"thishas"lotsof'bizarre"quotes'"];
正确有做法是把数字打包成 NSNumber对象
或者,你可以使用 -execute*WithFormat: ,这是NSString风格的参数
-execute*WithFormat: 的方法的内部实现会帮你封装数据, 以下这些修饰符都可以使用: %@,%c,%s,%d,%D,%i,%u,%U,%hi,%hu,%qi,%qu,%f,%g,%ld,%lu,%lld,and %llu. 除此之外的修饰符可能导致无法预知的结果。 一些情况下,你需要在sql语句中使用 % 字符,你应该使用 %%。
使用FMDatabaseQueue 及线程安全
在多个线程中同时使用一个FMDatabase实例是不明智的。现在你可以为每个线程创建一个FMDatabase对象。 不要让多个线程分享同一个实例,它无法在多个线程中同时使用。 若此,坏事会经常发生,程序会时不时崩溃,或者报告异常,或者陨石会从天空中掉下来砸到你Mac Pro. 总之很崩溃。所以,不要初始化FMDatabase对象,然后在多个线程中使用。请使用 FMDatabaseQueue,它是你的朋友而且会帮助你。以下是使用方法:
首先创建队列。
这样使用。
像这样,轻松地把简单任务包装到事务里: