核心数据:同步数据访问与应用程序和包含的扩展
Core Data: Synchronize data accesses with app and contained extension
我有一个 Cocoa 应用程序,其中包含 Today Extension。我使用 Core Data (SQLite) 在这两者之间存储和共享数据。两个应用程序共享一个组容器以访问相同的数据存储。这两个应用程序不仅读取而且写入导致问题的数据。有时,其中一个应用程序会抛出错误。到目前为止,我遇到了三种不同的错误类型:
Could not merge changes
Error in CoreDragRemoveTrackingHandler: -1856
Error in CoreDragRemoveReceiveHandler: -1856
CoreData: error: NULL _cd_rawData but the object is not being turned into a fault
Error in CoreDragRemoveReceiveHandler: -1856
CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[__NSCFSet addObject:]: attempt to insert nil with userInfo (null)
来自 iOS 开发库中的文章 Sharing Data with Your Containing App(这不是 iOS/Cocoa-Touch,而是 OSX/Cocoa - 但同样适用)我了解到:
To avoid data corruption, you must synchronize data accesses. Use Core Data, SQLite, or Posix locks to help coordinate data access in a shared container.
谁能告诉我这到底是什么意思?
Mac 开发库中的文章 Change Management 帮助我理解了这个问题。原来我遗漏了一些关于 Core Data 的基本概念。
托管对象上下文有一个合并策略,默认设置为NSErrorMergePolicy
,意味着它会导致错误:"Could not merge changes"
其他政策选项是:
NSMergeByPropertyStoreTrumpMergePolicy
NSMergeByPropertyObjectTrumpMergePolicy
NSOverwriteMergePolicy
NSRollbackMergePolicy
在我的例子中,设置 NSMergeByPropertyObjectTrumpMergePolicy
是最好的解决方案。 Swift 中的示例实现:
var managedObjectContext = NSManagedObjectContext()
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
还有其他概念,例如通过 NSManagedObjectContextDidSave
的通知。但我不确定这是否适用于两个不同的应用程序。
我还不确定其他错误。合并冲突是唯一可重现的案例。其他问题在两周内只出现过一两次。我认为这些与合并冲突无关。如果再次发生,我会更新答案。
我有一个 Cocoa 应用程序,其中包含 Today Extension。我使用 Core Data (SQLite) 在这两者之间存储和共享数据。两个应用程序共享一个组容器以访问相同的数据存储。这两个应用程序不仅读取而且写入导致问题的数据。有时,其中一个应用程序会抛出错误。到目前为止,我遇到了三种不同的错误类型:
Could not merge changes
Error in CoreDragRemoveTrackingHandler: -1856
Error in CoreDragRemoveReceiveHandler: -1856
CoreData: error: NULL _cd_rawData but the object is not being turned into a fault
Error in CoreDragRemoveReceiveHandler: -1856 CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[__NSCFSet addObject:]: attempt to insert nil with userInfo (null)
来自 iOS 开发库中的文章 Sharing Data with Your Containing App(这不是 iOS/Cocoa-Touch,而是 OSX/Cocoa - 但同样适用)我了解到:
To avoid data corruption, you must synchronize data accesses. Use Core Data, SQLite, or Posix locks to help coordinate data access in a shared container.
谁能告诉我这到底是什么意思?
Mac 开发库中的文章 Change Management 帮助我理解了这个问题。原来我遗漏了一些关于 Core Data 的基本概念。
托管对象上下文有一个合并策略,默认设置为NSErrorMergePolicy
,意味着它会导致错误:"Could not merge changes"
其他政策选项是:
NSMergeByPropertyStoreTrumpMergePolicy
NSMergeByPropertyObjectTrumpMergePolicy
NSOverwriteMergePolicy
NSRollbackMergePolicy
在我的例子中,设置 NSMergeByPropertyObjectTrumpMergePolicy
是最好的解决方案。 Swift 中的示例实现:
var managedObjectContext = NSManagedObjectContext()
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
还有其他概念,例如通过 NSManagedObjectContextDidSave
的通知。但我不确定这是否适用于两个不同的应用程序。
我还不确定其他错误。合并冲突是唯一可重现的案例。其他问题在两周内只出现过一两次。我认为这些与合并冲突无关。如果再次发生,我会更新答案。