核心数据:使用app和包含扩展名同步数据访问

时间:2015-02-12 15:13:09

标签: cocoa core-data

我有一个包含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锁来帮助协调共享容器中的数据访问。

有人可以指出我的方向是什么意思吗?

1 个答案:

答案 0 :(得分:3)

Mac Dev Library中的文章Change Management帮助我理解了这个问题。结果我错过了一些关于核心数据的基本概念。

托管对象上下文有一个合并策略,默认情况下设置为NSErrorMergePolicy,表示它导致错误:“无法合并更改”

其他政策选择包括:

  • NSMergeByPropertyStoreTrumpMergePolicy
  • NSMergeByPropertyObjectTrumpMergePolicy
  • NSOverwriteMergePolicy
  • NSRollbackMergePolicy

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

var managedObjectContext = NSManagedObjectContext()
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

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

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