核心数据:将数据访问与应用程序和包含的扩展同步
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)
,这会导致异常和/或返回包含“无法合并更改”的false
和error
。 error
不包含除此之外的任何内容。但是我的问题更多的是针对一般描述,而不是针对我的代码。用上面的引述解释了苹果的意思。
【参考方案1】:
Mac Dev Library 中的文章Change Management 帮助我理解了这个问题。原来我遗漏了一些关于 Core Data 的基本概念。
托管对象上下文有一个合并策略,默认设置为NSErrorMergePolicy
,这意味着它会导致错误:“无法合并更改”
其他政策选项有:
NSMergeByPropertyStoreTrumpMergePolicy
NSMergeByPropertyObjectTrumpMergePolicy
NSOverwriteMergePolicy
NSRollbackMergePolicy
在我的情况下,设置NSMergeByPropertyObjectTrumpMergePolicy
是最好的解决方案。 Swift 中的示例实现:
var managedObjectContext = NSManagedObjectContext()
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
还有其他概念,例如通过NSManagedObjectContextDidSave
通知。但我不确定这是否适用于两个不同的应用程序。
我还不确定其他错误。合并冲突是唯一可重现的情况。其他问题在两周内仅出现一两次。我不认为这些与合并冲突有关。如果再次发生,我会更新答案。
【讨论】:
以上是关于核心数据:将数据访问与应用程序和包含的扩展同步的主要内容,如果未能解决你的问题,请参考以下文章