核心数据:将数据访问与应用程序和包含的扩展同步

Posted

技术标签:

【中文标题】核心数据:将数据访问与应用程序和包含的扩展同步【英文标题】:Core Data: Synchronize data accesses with app and contained extension 【发布时间】:2015-02-12 15:13:08 【问题描述】:

我有一个包含 Today Extension 的 Cocoa 应用程序。我使用 Core Data (SQLite) 在这两者之间存储和共享数据。两个应用程序共享一个组容器以访问相同的数据存储。这两个应用程序不仅读取而且写入数据,这会导致问题。有时,任何一个应用程序都会引发错误。到目前为止,我遇到了三种不同的错误类型:

无法合并更改


CoreDragRemoveTrackingHandler 中的错误:-1856

CoreDragRemoveReceiveHandler 中的错误:-1856


CoreData: error: NULL _cd_rawData 但对象没有变成故障


CoreDragRemoveReceiveHandler 中的错误:-1856 CoreData:错误:严重的应用程序错误。在核心数据更改处理期间捕获到异常。这通常是 NSManagedObjectContextObjectsDidChangeNotification 观察者中的一个错误。 -[__NSCFSet addObject:]: 尝试用 userInfo (null) 插入 nil

ios 开发库中的文章 Sharing Data with Your Containing App(这不是 iOS/Cocoa-Touch,而是 OSX/Cocoa - 但同样适用)我了解到:

为避免数据损坏,您必须同步数据访问。使用 Core Data、SQLite 或 Posix 锁来帮助协调共享容器中的数据访问。

有人可以指点我一个方向吗?这到底是什么意思?

【问题讨论】:

如果您编辑问题以包含发生这些异常的代码行,这将有所帮助。此外,complete 错误消息(Core Data 可能会说“无法合并更改”,但它会说的远不止这些)。 异常未绑定到我的代码的任何行。发生这种情况时,一些神秘的胡言乱语可能会以绿色突出显示。我唯一能展示的是mangedObjectContext.save(&error),这会导致异常和/或返回包含“无法合并更改”的falseerrorerror 不包含除此之外的任何内容。但是我的问题更多的是针对一般描述,而不是针对我的代码。用上面的引述解释了苹果的意思。 【参考方案1】:

Mac Dev Library 中的文章Change Management 帮助我理解了这个问题。原来我遗漏了一些关于 Core Data 的基本概念。

托管对象上下文有一个合并策略,默认设置为NSErrorMergePolicy,这意味着它会导致错误:“无法合并更改”

其他政策选项有:

NSMergeByPropertyStoreTrumpMergePolicy NSMergeByPropertyObjectTrumpMergePolicy NSOverwriteMergePolicy NSRollbackMergePolicy

在我的情况下,设置NSMergeByPropertyObjectTrumpMergePolicy 是最好的解决方案。 Swift 中的示例实现:

var managedObjectContext = NSManagedObjectContext()
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

还有其他概念,例如通过NSManagedObjectContextDidSave 通知。但我不确定这是否适用于两个不同的应用程序。

我还不确定其他错误。合并冲突是唯一可重现的情况。其他问题在两周内仅出现一两次。我不认为这些与合并冲突有关。如果再次发生,我会更新答案。

【讨论】:

以上是关于核心数据:将数据访问与应用程序和包含的扩展同步的主要内容,如果未能解决你的问题,请参考以下文章

今日扩展:与容器应用同步数据

WatchKit 核心数据同步

从小部件扩展访问核心数据

评估将核心数据与 Dropbox 同步的策略

与主应用程序共享核心数据上下文的应用程序扩展编程指南

如何将 sqlite 数据库与 Core Data 同步?