Cocoa 核心数据:与应用程序和包含的扩展同步数据访问
我有一个Cocoa应用程序,它包含一个Today扩展。我使用核心数据(SQLite)在这两者之间存储和共享数据。两个应用共享一个组容器以访问同一数据存储。这两个应用程序不仅读取数据,还写入数据,这会导致问题。有时,两个应用程序中的任何一个都会抛出错误。到目前为止,我经历了三种不同的错误类型: 无法合并更改Cocoa 核心数据:与应用程序和包含的扩展同步数据访问,cocoa,core-data,Cocoa,Core Data,我有一个Cocoa应用程序,它包含一个Today扩展。我使用核心数据(SQLite)在这两者之间存储和共享数据。两个应用共享一个组容器以访问同一数据存储。这两个应用程序不仅读取数据,还写入数据,这会导致问题。有时,两个应用程序中的任何一个都会抛出错误。到目前为止,我经历了三种不同的错误类型: 无法合并更改 CoreDragRemoveTrackingHandler中出错:-1856 CoreDragRemoveReceiveHandler中出错:-1856 CoreData:错误:NULL
CoreDragRemoveTrackingHandler中出错:-1856 CoreDragRemoveReceiveHandler中出错:-1856
CoreData:错误:NULL _cd_rawData,但对象未转换为错误
CoreDragRemoveReceiveHandler中出错:-1856 CoreData:错误:严重的应用程序错误。在核心数据更改处理期间捕获异常。这通常是NSManagedObjectContextObjectsIDChangeNotification的观察者中的错误-[\uu NSCFSet addObject:]:尝试使用userInfo(null)插入nil 从iOS开发库中的文章(这不是iOS/Cocoa Touch,而是OSX/Cocoa,但同样适用)我学到了: 要避免数据损坏,必须同步数据访问。使用核心数据、SQLite或Posix锁帮助协调共享容器中的数据访问 有人能告诉我这到底意味着什么吗?Mac开发库中的文章帮助我理解了这个问题。结果发现我遗漏了一些关于核心数据的基本概念 托管对象上下文具有合并策略,默认情况下,该策略设置为
NSErrorMergePolicy
,这意味着它将导致错误:“无法合并更改”
其他政策选择包括:
nsmergebypropertystoretrompmergepolicy
NSMergeByPropertyObject特朗普合并策略
NSOverwriteMergePolicy
NSRollbackMergePolicy
NSMergeByPropertyObjectTrumpMergePolicy
是最好的解决方案。Swift中的实施示例:
var managedObjectContext = NSManagedObjectContext()
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
还有其他概念,例如通过NSManagedObjectContextDidSave
发送通知。但我不确定这是否适用于两种不同的应用程序
我还不确定还有哪些错误。合并冲突是唯一可重现的情况。在两周的时间里,其他问题只出现了一两次。我认为这与合并冲突无关。如果这些情况再次发生,我将更新答案。如果您编辑问题,将出现这些异常的代码行包括在内,这将有所帮助。此外,完整的错误消息(核心数据可能会说“无法合并更改”,但它会说的远不止这些)。异常不会绑定到我的代码的任何行。当这些事情发生时,一些神秘的胡言乱语可能会以绿色突出显示。我唯一能显示的是
mangedObjectContext.save(&error)
,它会导致异常和/或返回包含“无法合并更改”的false
和error
。错误
不包含除此之外的任何内容。但我的问题更多的是针对一般性的描述,而不是针对我的代码。这可以解释苹果在上面引用的意思。