FMDB

常用数据库语句

http://www.cnblogs.com/wengzilin/archive/2012/03/27/2419851.html

官方文档说关于多线程的一些东西
FMDatabaseQueue虽然看似一个队列,实际上它本身并不是,它通过内部创建一个Serial的dispatch_queue_t来处理通过inDatabase和inTransaction传入的Blocks,所以当我们在主线程(或者后台)调用inDatabase或者inTransaction时,代码实际上是同步的。FMDatabaseQueue这么设计的目的是让我们避免发生并发访问数据库的问题,因为对数据库的访问可能是随机的(在任何时候)、不同线程间(不同的网络回调等)的请求。内置一个Serial队列后,FMDatabaseQueue就变成线程安全了,所有的数据库访问都是同步执行,而且这比使用@synchronized或NSLock要高效得多。
先创建一个队列

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath]; 

然后非事务的

[queue inDatabase:^(FMDatabase *db) {    
          [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];    
          [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];    
          [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];    
          FMResultSet *rs = [db executeQuery:@"select * from foo"];    
         while([rs next]) {   
            …    
         }    
}];   

以下是数据库事务: 即把几个任务绑在一起, 要么一起成功执行, 要么都失败

[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {    
        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];    
        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];    
        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];    
        if (whoopsSomethingWrongHappened) {    
                *rollback = YES; return;    
        }   
        // etc…    
        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]];    
}];

那么FMDB帮我们实现了线程安全, 那我们也要进行适当的性能优化, 不把读写操作塞在主线程进行

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self.databaseQueue inDatabase:^(FMDatabase *db) {
        //do something...
     }];
  //回归主线程
    dispatch_async(dispatch_get_main_queue(), ^{
        //更新UI
    });
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这几天在写文件下载,断点续传,需要用到FMDB进行数据的管理,等写完也总结一下。 其实也是这两天才学习 FMDB,...
    YoRuo_阅读 450评论 0 5
  • 一.介绍:1.FMDB是什么?2.优点?3.核心类?4.根据路径打开数据库的三种情况?5.更新/查询操作? 二.使...
    my__life阅读 428评论 0 1
  • FMDB v2.6.2 这是个SQLite的OC封装。SQLite的地址:http://sqlite.org/ F...
    原鸣清阅读 2,335评论 0 3
  • TopicList 一.FMDB 简介 二.FMDB 使用说明 三.FMDB 创建及使用方法 四.FMDataba...
    爨乡的云阅读 5,940评论 5 49
  • 在App中保持一个FMDatabaseQueue的实例,并在所有的线程中都只使用这一个实例。 FMDatabase...
    Crazy2015阅读 1,504评论 0 1