【问题标题】:How to use FMDB in background with SQLCipher?如何通过 SQLCipher 在后台使用 FMDB?
【发布时间】: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 不会异步执行任何操作。)还是失败了?如果失败,你检查setKeyexecuteQuery的返回码了吗?他们分别是TRUE 和非nil 吗?如果任一失败,lastErrorMessage 是什么?

标签: fmdb sqlcipher


【解决方案1】:

要异步运行,FMDatabaseQueue 不会为您执行此异步操作,而只是为您提供一个框架,以便当您从多个线程与此队列交互时,交互将为您同步。

因此,可以 (a) 为整个应用实例化一个 FMDatabaseQueue 对象; (b) 当你想异步运行某些东西时,你必须从后台调度或操作队列中运行它。

例如:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT), ^{
    [_queueSelect inDatabase:^(FMDatabase *db) {
        // do your stuff here
    }];
});

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 2016-11-09
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多