众所周知,要使FMDB支持多线程操作,需要使用FMDatabaseQueue,
觉得FMDatabaseQueue这种block回调方式使用不方便的可以用以下方式实现数据库单连接支持多线程操作:
- 修改FMDatabase.m文件 open 方法
- (BOOL)open {
if (_db) {
return YES;
}
/** 添加以下两句*/
/** add by xxx at 20151119 begin*/
sqlite3_shutdown();
sqlite3_config(SQLITE_CONFIG_SERIALIZED);
/** add by xxx at 20151119 end*/
int err = sqlite3_open([self sqlitePath], &_db );
if(err != SQLITE_OK) {
NSLog(@"error opening!: %d", err);
return NO;
}
if (_maxBusyRetryTimeInterval > 0.0) {
// set the handler
[self setMaxBusyRetryTimeInterval:_maxBusyRetryTimeInterval];
}
return YES;
}
- 注释 FMDatabase.m文件 中出现
if (_isExecutingStatement)
的地方,总共有4
处
- (sqlite_int64)lastInsertRowId {
// if (_isExecutingStatement) {
// [self warnInUse];
// return NO;
// }
_isExecutingStatement = YES;
sqlite_int64 ret = sqlite3_last_insert_rowid(_db);
_isExecutingStatement = NO;
return ret;
}
- (int)changes {
// if (_isExecutingStatement) {
// [self warnInUse];
// return 0;
// }
_isExecutingStatement = YES;
int ret = sqlite3_changes(_db);
_isExecutingStatement = NO;
return ret;
}
....
现在可以直接使用FMdatabase进行多线程操作了,不必使用FMDatabaseQueue这种block回调方式,代码简洁又易懂。