如何通过 SQLCipher 在后台使用 FMDB?
Posted
技术标签:
【中文标题】如何通过 SQLCipher 在后台使用 FMDB?【英文标题】:How to use FMDB in background with SQLCipher? 【发布时间】:2015-11-10 13:59:21 【问题描述】:我在后台进行查询时遇到了一些问题。
我从互联网下载一个 JSON,用 Reskit 解析它,然后用 FMDB 将一组对象保存到我用 SQLCipher 加密的 sqlite3 数据库中。
这是一个例子:
FMDatabaseQueue *_queueSelect = [FMDatabaseQueue databaseQueueWithPath:[DataBaseController getPathBaseDatos]];
[_queueSelect inDatabase:^(FMDatabase *db)
[db setKey:DATABASE_KEY];
FMResultSet *existeConsulta = [db executeQuery:sql];
while([existeConsulta next])
[results addObject:[existeConsulta resultDictionary]];
];
我尝试使用“inTransaction” 和“dispatch_async” 但没有成功。
完成这项任务的正确方法是什么?
【问题讨论】:
“没有成功”是什么意思?它是否成功运行,但不是异步运行? (这是有道理的,因为这段代码 sn-p 不会异步执行任何操作。)还是失败了?如果失败,你检查setKey
和executeQuery
的返回码了吗?他们分别是TRUE
和非nil
吗?如果任一失败,lastErrorMessage
是什么?
【参考方案1】:
要异步运行,FMDatabaseQueue
不会为您执行此异步操作,而只是为您提供一个框架,以便当您从多个线程与此队列交互时,交互将为您同步。
因此,可以 (a) 为整个应用实例化一个 FMDatabaseQueue
对象; (b) 当你想异步运行某些东西时,你必须从后台调度或操作队列中运行它。
例如:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT), ^
[_queueSelect inDatabase:^(FMDatabase *db)
// do your stuff here
];
);
【讨论】:
以上是关于如何通过 SQLCipher 在后台使用 FMDB?的主要内容,如果未能解决你的问题,请参考以下文章
迁移 SQLCipher 版本。 2.x 数据库到版本。 FMDB 使用的 3.x
将 FMDB + SQLCipher 与 Rubymotion 一起使用?
FMDB/SQLCipher 和 FMDBMigrationManager 迁移失败