摘要
我的问题是我想摆脱基于Coret的iOS项目中使用Ensembles与iCloud同步的几乎重复项。
详细问题
用户可以在连接到iCloud之前在不同的设备上创建
NSManagedObjects
。可以说他有一个名为NSManagedObject
的Car
,它与一个名为NSManagedObject
的Person
有一个“To One”关系,而后者又与Car
有一个“To Many”关系。看起来像这样:好的,假设用户有两个设备,并且他在每个设备上创建了两个
NSManagedObjects
。名为“Audi”的Car
和名为“Raphael”的Person
。两者通过某种关系联系在一起。在另一台设备上,他创建了一个名为“BMW”的Car
和另一个名为“Raphael”的Person
。也互相连接。现在,用户在每个设备上都有两个相似的对象:两个名为“Raphael”的Person
对象。我的问题是,用户在同步后最终将在每个设备上拥有两个名为“Raphael”的
Person
对象。实际上这是正确的,因为当用户释放其持久性存储时,对象将获得其uniqueIdentifiers(以标识Ensembles中的对象)。这些对象实际上是不同的。但这是我要解决的问题。
我的方法
我实现了此委托方法,并删除了reparationContext中的重复项。
- (BOOL)persistentStoreEnsemble:(CDEPersistentStoreEnsemble *)ensemble
shouldSaveMergedChangesInManagedObjectContext:(NSManagedObjectContext*)savingContext
reparationManagedObjectContext(NSManagedObjectContext *)reparationContext {
[reparationContext performBlockAndWait:^{
// Find duplicates
// Change relationships and only use the inserted Person object (the one from iCloud)
// Delete local Person object
[reparationContext save:nil];
}
return YES;
}
基本上,这似乎在合并来自第一个设备的数据的第二个设备上很好用。但是不幸的是,即使在reparationContext中删除了本地人,它似乎仍然同步到iCloud。
由于第一设备随后还合并了来自第二设备的更改并再次替换了已在第二设备上删除的人员,因此这导致了损坏状态。某些同步之后,该人最终在汽车关系中失踪了,该应用引发了同步错误。
重现问题的步骤
汽车“Audi”->人员“Raphael(设备1)”
汽车“宝马”->人“拉斐尔(设备1)”
汽车“Audi”->人员“Raphael(设备1)”
汽车“宝马”->人“拉斐尔(设备1)”
汽车“Audi”->人员“Raphael(设备2)”
汽车“宝马”->人“拉斐尔(设备2)”
实际上,本地人对象“Raphael(设备2)”已在步骤4中删除,但似乎仍被发送到iCloud,因为在步骤5中,它是
savingContext.insertedObjects
委托方法中shouldSaveMergedChangesInManagedObjectContext
中的插入内容。据我了解,Ensembles首先从iCloud提取更改,通过委托方法询问用户是否一切都如预期,然后合并到持久性存储中,并在合并后将增量发送到iCloud。
难道我做错了什么?还是这是一个Ensembles错误?
最佳答案
lars提到了一个问题。您必须小心,始终确定性地做事。按唯一ID排序是实现此目的的一种方法。
就个人而言,我将通过以下两种其他方式之一来处理:
例如,您可以使用唯一的ID
Raphael
。您唯一需要注意的是,当您在同一台计算机上创建另一个Raphael时,它称为Raphael_1
(或其他名称)。如果您的唯一ID很可能是唯一的(例如,名字+姓氏不太可能发生冲突),则Ensembles会自动将该人合并到其他设备上。
关于ios - 使用Core Data和Ensembles(iCloud)删除几乎重复的副本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34979063/