【问题标题】:Record uniqueness when using NSPersistentCloudKitContainer?使用 NSPersistentCloudKitContainer 时记录唯一性?
【发布时间】:2020-05-10 15:52:45
【问题描述】:

我已成功将我的应用迁移到使用 NSPersistentCloudKitContainer 以便使用 CloudKit 同步其数据。

但是,我想知道我应该如何处理某些实体的唯一性。例如,假设 User 实体具有需要唯一的属性 emailAddress。现在考虑两个设备创建具有相同电子邮件地址的User 实例的情况。在我目前的实现中,没有任何东西强制唯一性,所以我最终让这两个实例在两个设备上都可用,只要它们同步更改。

目前,每当我假设它们是唯一的实体时,我都会检查它们是否真的是,如果不是,则合并它们,包括将一个实例的关系分配给另一个实例。合并后,我删除了“空”实例。虽然这似乎工作正常,但我也可以假设这可能会出错:当两个设备同时合并并最终删除不同的实例导致所有实例都被删除时。

这种情况应该如何处理?

PS。我一直在寻找类似的问题,发现了一些类似的问题,但它们都与明确使用 CKRecord 有关。由于我使用的是 NSPersistentCloudKitContainer,它封装并简化了 CloudKit 实现,因此我不使用那些“低级”类。

【问题讨论】:

标签: swift cocoa icloud cloudkit nspersistentcloudkitcontainer


【解决方案1】:

NSPersistentCloudKitContainer 仅使用用户的私有数据库区域。您必须有一个公共数据库区域并使用给定的电子邮件获取用户记录。但是,如果您计划在欧盟注册您的应用程序,这可能很重要。他们严格的 GDPR 规则不允许公开电子邮件。

您很可能最终拥有自己的数据库和符合您要求的后端逻辑。

【讨论】:

    【解决方案2】:

    Core Data 具有唯一性约束,可以在单个字段或多个字段上设置。不要忘记设置mergePolicy,这样Core Data 就知道你希望它在保存时如何处理冲突。这是一个较早的 Stack 帖子,讨论了它。

    How to add unique constraints for some fields in Core Data

    CloudKit 对此没有后端逻辑,它基本上是一个键/值存储。

    【讨论】:

    • 所以 NSPersistentCloudKitContainer 是两者的结合,唯一性不能用约束来解决,对吧?
    • 不能在 NSPersistentCloudKitContainer 中使用唯一约束,见developer.apple.com/documentation/coredata/…。@Brian Hamm
    猜你喜欢
    • 1970-01-01
    • 2016-11-05
    • 2023-04-04
    • 1970-01-01
    • 2012-01-02
    • 2022-09-23
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多