【问题标题】:Swift Core Data Query Generation Sqlite error code 769 ( sqlite3_snapshot_open failed )Swift 核心数据查询生成 Sqlite 错误代码 769 ( sqlite3_snapshot_open failed )
【发布时间】:2019-08-06 14:55:59
【问题描述】:

我正在使用核心数据查询生成,对于每次读取视图上下文数据我执行以下操作

  1. 固定上下文
  2. 读取(获取请求)
  3. 取消固定上下文

一切都按预期正常工作,但有时我会收到以下错误:

错误:SQLCore dispatchRequest:异常处理请求:,sqlite3_snapshot_open 失败,userInfo 为 { NSSQLiteErrorDomain = 769; } CoreData:错误:SQLCore dispatchRequest:异常处理请求:,sqlite3_snapshot_open 失败,userInfo 为 { NSSQLiteErrorDomain = 769; }

在代码下方固定/取消固定上下文:

// MARK: Query generation
    func pinContext() {
        do {
            context.reset()
            try context.setQueryGenerationFrom(NSQueryGenerationToken.current)
        } catch {
            fatalError("Context pinning:\(error)")
        }
    }

    func unpinContext() {
        do {
            try context.setQueryGenerationFrom(nil)
        } catch {
            fatalError("Context unpinning:\(error)")
        }
    }

sqlite.org 网站的错误代码 (769) SQLITE_ERROR_SNAPSHOT 状态:

使用 sqlite3_snapshot_open() 接口尝试在数据库的历史版本上启动读取事务时,可能会返回 SQLITE_ERROR_SNAPSHOT 结果代码。如果历史快照不再可用,则读取事务将失败并返回 SQLITE_ERROR_SNAPSHOT。仅当使用 -DSQLITE_ENABLE_SNAPSHOT 编译 SQLite 时,才可能出现此错误代码。

现在,我该如何处理或防止 Core 数据中出现此错误?

【问题讨论】:

  • 你想出解决方案了吗?谢谢!

标签: swift core-data


【解决方案1】:
bgCTX = container.newBackgroundContext()
bgCTX.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump
bgCTX.automaticallyMergesChangesFromParent = true
try bgCTX.setQueryGenerationFrom(NSQueryGenerationToken.current)

【讨论】:

  • 不添加注释来说明代码的用途是没有帮助的。但这并不能解决问题。
【解决方案2】:

您是否将automaticallyMergesChangesFromParent 设置为true?如果是这样,那似乎会引起问题。根据NSManagedObjectContext的评论:

/* Whether the context automatically merges changes saved to its coordinator or
parent context. Setting this property to YES when the context is pinned to a non-
current query generation is not supported.
*/
@available(iOS 10.0, *)
open var automaticallyMergesChangesFromParent: Bool

如果您的上下文被固定到“当前”查询生成令牌,那么这应该不是问题。但是,如果您将数据保存到其他上下文中的存储区,该查询生成令牌可能会很快变得陈旧(非当前)。一旦尝试合并来自父级的更改,它就会进入未知状态,从而导致此错误/崩溃。

据我所知,在固定上下文时将 automaticallyMergesChangesFromParent 设置为 false 是最安全的方法。然后你可以在取消固定时再次将其设置为true。

我希望 Apple 能用这个更新他们的文档,但我们必须在他们的代码中的注释中找到它。

【讨论】:

  • 这无关紧要,因为我们可以看到 OP 正在使用当前的查询生成令牌。
猜你喜欢
  • 1970-01-01
  • 2017-05-20
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
相关资源
最近更新 更多