FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句
FMResultSet使用FMDatabase执行查询后的结果集
FMDatabaseQueue用于在多线程中执行多个查询或更新,它是线程安全的。
在多个线程中同时使用一个FMDatabase实例是不明智的。
现在你可以为每 个线程创建一个FMDatabase对象,不要让多个线程分享同一个实例,他无 法在多个线程中同事使用。
否则程序会时不时崩溃或者报告异常。所以,不要 初始化FMDatabase对象,然后在多个线程中使用。
这时候,我们就需要使 用FMDatabaseQueue来创建队列执行事务。
但是对数据的操作最重要的还是安全问题,当多个线程对数据库进行操作的时候,一定会出问题的,
笔者遇到的问题是,当向数据库插入大量的数据时,如果再去做查询操作,插入操作会中断,甚至引起程序崩溃。
那么FMDB对于解决线程安全问题的方法是引入FMDatabaseQueue,该队列是一个串行队列,加入该队列的线程会按顺序执行,避免多个线程同时操作数据库,FMDatabaseQueue也很好用:
queue [FMDatabaseQueuedatabaseQueueWithPath:database_Path]; //创建队列
然后直接调用 - (void)inDatabase:(void (^)(FMDatabase *db))block 方法即可,该方法采用block回调,可以直接对db执行操作。但是在开发的过程中极易造成死锁,
如果出现"inDatabase: was called reentrantly on the same queue, which would lead to a deadlock",就说明在工程中有嵌套执行任务,即在inDatabase方法中又调用了该方法,造成了死锁