我已经成功地将我的应用程序迁移到使用NSPersistentCloudKitContainer,以便使用CloudKit同步其数据。
然而,我想知道我应该如何处理某些实体的唯一性。例如,假设一个具有需要唯一的属性emailAddress的User实体。现在考虑两个设备创建具有相同电子邮件地址的User实例的情况。在我目前的实现中,没有任何东西强制唯一性,所以我最终让两个实例在两个设备上都可用,只要它们获得了要同步的更改。
目前,每当我假设实体是唯一的时,我都会检查它们是否真的是唯一的,如果不是,就合并它们,包括将其中一个实例的关系分配给另一个实例。在合并之后,我删除了“空”实例。虽然这似乎工作得很好,但我也可以假设这种情况可能会出错:当两个设备同时合并并最终删除不同的实例时,会导致所有实例都被删除。
我应该如何处理这样的情况?
PS。我一直在搜索类似的问题,发现了一些类似的问题,但它们都与明确使用CKRecord有关。因为我使用的是NSPersistentCloudKitContainer,它封装和简化了CloudKit实现,所以我没有使用那些“低级”类。
发布于 2020-09-18 03:59:37
NSPersistentCloudKitContainer仅使用用户的私有数据库区域。您必须有一个公共数据库区域,并使用给定的电子邮件获取用户记录。然而,如果您计划在欧盟注册您的应用程序,这可能是至关重要的。他们严格的GDPR规则不允许公开电子邮件。
你会最喜欢拥有自己的数据库和后端逻辑来满足你的需求。
发布于 2020-02-03 10:24:14
核心数据具有单一性约束,可以在单个字段上设置,也可以在多个字段上设置。别忘了设置一个mergePolicy,这样核心数据就能知道你希望它在保存时如何处理冲突。这里有一个早期的Stack帖子谈到了这一点。
How to add unique constraints for some fields in Core Data
CloudKit对此没有后端逻辑,它基本上是一个键/值存储。
https://stackoverflow.com/questions/59894423
复制相似问题