首先用一個(gè)數(shù)據(jù)庫(kù)文件地址來(lái)初使化FMDatabaseQueue,然后就可以將一個(gè)閉包(block)傳入inDatabase方法中顺少。 在閉包中操作數(shù)據(jù)庫(kù)王浴,而不直接參與FMDatabase的管理。
FMDatabaseQueue解決這個(gè)問(wèn)題的思路是:創(chuàng)建一個(gè)隊(duì)列氓辣,然后將放入隊(duì)列的block順序執(zhí)行,這樣避免了多線(xiàn)程同時(shí)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù);
如果是多線(xiàn)程各創(chuàng)建FMDatabaseQueue的實(shí)例几蜻,其實(shí)有多個(gè)隊(duì)列体斩,還是存在數(shù)據(jù)庫(kù)競(jìng)爭(zhēng)的問(wèn)題,和用FMDatabase時(shí)是一樣的絮吵;
讓每個(gè)線(xiàn)程使用同一個(gè)Queue實(shí)例,問(wèn)題就解決了!
@property (nonatomic, strong) FMDatabaseQueue *commonQueue;
NSString *commonQueuePath = [NSFileManager pathDBCommon];
self.commonQueue = [FMDatabaseQueue databaseQueueWithPath:commonQueuePath];
重點(diǎn)是這個(gè)O牖谩!闹究!
- (void)excuteQuerySQL:(NSString*)sqlStr resultBlock:(void(^)(FMResultSet * rsSet))resultBlock
{
if (self.dbQueue) {
[_dbQueue inDatabase:^(FMDatabase *db) {
FMResultSet * retSet = [db executeQuery:sqlStr];
if (resultBlock) {
resultBlock(retSet);
}
}];
}