我有一个包含Today Extension的Cocoa应用程序。我使用Core Data(SQLite)来存储和共享这两者之间的数据。两个应用程序共享一个组容器,以访问同一个数据存储。这两个应用程序不仅可以读取,还可以写入导致问题的数据。有时,任一应用程序都会抛出错误。到目前为止,我遇到了三种不同的错误类型:
无法合并更改
CoreDragRemoveTrackingHandler出错:-1856
CoreDragRemoveReceiveHandler中的错误:-1856
CoreData:错误:NULL _cd_rawData但对象没有变成错误
CoreDragRemoveReceiveHandler中的错误:-1856 CoreData:错误:严重的应用程序错误。在Core Data更改处理期间捕获到异常。这通常是NSManagedObjectContextObjectsDidChangeNotification的观察者中的错误。 - [__ NSCFSet addObject:]:尝试使用userInfo(null)插入nil
来自iOS开发库中的文章Sharing Data with Your Containing App(这不是iOS / Cocoa-Touch,但OSX / Cocoa - 但同样适用)我学到了:
为避免数据损坏,您必须同步数据访问。使用Core Data,SQLite或Posix锁来帮助协调共享容器中的数据访问。
有人可以指出我的方向是什么意思吗?
答案 0 :(得分:3)
Mac Dev Library中的文章Change Management帮助我理解了这个问题。结果我错过了一些关于核心数据的基本概念。
托管对象上下文有一个合并策略,默认情况下设置为NSErrorMergePolicy
,表示它导致错误:“无法合并更改”
其他政策选择包括:
NSMergeByPropertyStoreTrumpMergePolicy
NSMergeByPropertyObjectTrumpMergePolicy
NSOverwriteMergePolicy
NSRollbackMergePolicy
在我的情况下,设置NSMergeByPropertyObjectTrumpMergePolicy
是最佳解决方案。 Swift中的示例实现:
var managedObjectContext = NSManagedObjectContext()
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
还有其他概念,例如通过NSManagedObjectContextDidSave
发出的通知。但我不确定这适用于两种不同的应用程序。
我还不确定其他错误。合并冲突是唯一可以重现的案例。其他问题在两周内只出现过一次或两次。我不认为这些与合并冲突有关。如果再次发生,我会更新答案。