直接使用 FMDatabase(一个对象对应一个sqlite3*)对应第一种模式,自己持有并保证进行单线程操作
使用FMDatabasePool对应第二种模式,保证不同线程使用同一个FMDatabasePool对象而使用不同的FMDatabase对象来进行数据库操作
使用FMDatabaseQueue对应第三种模式,可以多线程访问,但是都是使用同一个FMDatabase对象,保证同时只有一个线程持有FMDatabase对象,排起队来一个一个访问操作
简略的数据库操作代码:
//打开数据库返回sqlite3* int err = sqlite3_open([self sqlitePath], (sqlite3**)&_db ); int err = sqlite3_open_v2([self sqlitePath], (sqlite3**)&_db, flags, [vfsName UTF8String]); ///语法检查返回 sqlite3_stmt* (如果需要复用的话需要将对象重置sqlite3_reset(pStmt);) rc = sqlite3_prepare_v2(_db, [sql UTF8String], -1, &pStmt, 0); ///通过sqlite3_stmt*绑定条件赋值的参数数据 NSString *parameterName = [[NSString alloc] initWithFormat:@":%@", dictionaryKey]; int idx = sqlite3_bind_parameter_index(pStmt, [parameterName UTF8String]); sqlite3_bind_blob(pStmt, idx, bytes, (int)[obj length], SQLITE_STATIC); sqlite3_bind_text(pStmt, idx, [[self stringFromDate:obj] UTF8String], -1, SQLITE_STATIC); sqlite3_bind_double(pStmt, idx, [obj floatValue]); ///读取这条命令返回结果(对应update后续命令或next命令) rc = sqlite3_step(pStmt); ///通过pStmt读取想要的数据 const char *c = (const char *)sqlite3_column_text(pStmt, columnIdx);