CoreData(+ iCloud)生成无效的模型状态

时间:2015-02-27 10:28:20

标签: ios core-data icloud

我使用CoreData和iCloud在设备之间同步数据。

每次iCloud导入(观察NSPersistentStoreDidImportUbiquitousContentChangesNotification)后,我都会运行一个简单的重复数据删除算法来查找和删除重复数据。 保存更改后,我在CoreData的控制台中看到警告,特定实体实例的所有属性和关系(由重复数据删除算法删除)都替换为nil / 0。

CoreData: warning: An NSManagedObjectContext delegate overrode fault handling behavior to silently delete the object with ID '0xd000000000040006 <x-coredata://ADDDABCD-4891-4DCF-B55B-53AA64D11922/<ENTITY_NAME>/p1>' and substitute nil/0 for all property values instead of throwing.

问题是此实体中的一个关系不是可选的,下次iCloud想要在其他设备上导入这些更改时会产生错误。

-[_PFUbiquityRecordsImporter operation:failedWithError:](979): CoreData: Ubiquity:  Import operation encountered had trouble importing log file, Error Domain=NSCocoaErrorDomain Code=134302 "The operation couldn’t be completed. (Cocoa error 134302.)" 
[...], an error occurred saving changes to the persistent store mutated during the import process. [...] 
"The operation couldn’t be completed. (Cocoa error 1560.)"} User Info: { [...] 
NSValidationErrorObject=<NSManagedObject: 0x1742c7bd0> (entity: <ENTITY_NAME>; [...] 
{NSValidationErrorKey=<NON-OPTIONAL_RELATIONSHIP_NAME> [...] 
"Error encountered while importing transaction log at URL: ...

如何避免将所有属性设置为nil / 0?

1 个答案:

答案 0 :(得分:0)

我是如何解决的。

我最大的错误是我处理NSPersistentStoreDidImportUbiquitousContentChangesNotification通知的方式。 我只合并了我的&#34; main&#34;上下文(在主线程中使用)。但是我忘了将这些变化合并到我的第二个&#34; root&#34;上下文(类型NSPrivateQueueConcurrencyType)以及我用来将上下文保存到持久性存储中的内容,并且是&#34; main&#34;的主体。上下文。

在不知道内部情况的情况下,我怀疑是因为我的&#34; root&#34;上下文不知道无处不在的内容更改,下次保存更改时,生成的事务日志(写入iCloud)是不一致的。现在我将更改通知合并到我的&#34; root&#34;和&#34;主要&#34;背景和事情开始变得更好。