【问题标题】:Synchronize CoreData objects using a private key but keep the unique Object ID same for relationship使用私钥同步 CoreData 对象,但保持唯一的对象 ID 相同的关系
【发布时间】:2023-03-07 12:07:01
【问题描述】:

这是场景:

我有一个托管对象:

Category

带属性:

categoryId String
categoryName String
subCategory SubCategory

SubCategory managedObject 具有以下属性:

categoryId String
categoryName String
categoryInverse Category
contractInverse Contract

Contract managedObject 具有以下属性:

contractId String
contractName String
subCategoryInverse SubCategory

我从 Web 服务获取 JSON 格式的类别和子类别数据,然后通过反向关系创建与类别和子类别相关联的合同。

问题是,当我在应用程序启动时从服务器检索 Categories 和 SubCategories 的新列表时,我删除了以前的 CategoriesSubCategories 并用新数据填充它们。这反过来又打破了关系,新的Contract 对象具有子类别对象的nil,这将是我到Category 对象(contract.subCategoryInverse.categoryInverse) 的链接

如何在不丢失现有关系的情况下更新Category/SubCategory 数据?

【问题讨论】:

  • 显而易见的是不要删除现有的对象,而是在适当的位置更新它们。为什么要在应用启动时删除所有内容?
  • 有没有一种简单的方法来更新记录而不是全部删除并添加新对象?特别是当服务器不支持任何同步策略时。
  • 获取现有记录,更改其值并保存更改。

标签: ios swift core-data entity-relationship nsmanagedobject


【解决方案1】:
  1. 从服务器获取更新数据
  2. 获取所有类别
  3. 将它们全部放在字典中,以 categoryId 为键,managedObject 为值。
  4. 还将所有类别 managedObjects 放入 mutableSet categoriesToDelete
  5. 现在通过您的服务器数据从字典中按 ID 获取类别。如果它不存在,则创建它。如果存在,则将其从 categoriesToDelete 中删除并更新。
  6. 删除categoriesToDelete中的所有对象
  7. 对子类别做同样的事情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    相关资源
    最近更新 更多