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)