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

Cocoa 核心数据:与应用程序和包含的扩展同步数据访问,cocoa,core-data,Cocoa,Core Data,我有一个Cocoa应用程序,它包含一个Today扩展。我使用核心数据(SQLite)在这两者之间存储和共享数据。两个应用共享一个组容器以访问同一数据存储。这两个应用程序不仅读取数据,还写入数据,这会导致问题。有时,两个应用程序中的任何一个都会抛出错误。到目前为止,我经历了三种不同的错误类型: 无法合并更改 CoreDragRemoveTrackingHandler中出错:-1856 CoreDragRemoveReceiveHandler中出错:-1856 CoreData:错误:NULL

我有一个Cocoa应用程序,它包含一个Today扩展。我使用核心数据(SQLite)在这两者之间存储和共享数据。两个应用共享一个组容器以访问同一数据存储。这两个应用程序不仅读取数据,还写入数据,这会导致问题。有时,两个应用程序中的任何一个都会抛出错误。到目前为止,我经历了三种不同的错误类型:

无法合并更改


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
错误
不包含除此之外的任何内容。但我的问题更多的是针对一般性的描述,而不是针对我的代码。这可以解释苹果在上面引用的意思。