【问题标题】:How to check in which persistent store a managed object stored?如何检查托管对象存储在哪个持久存储中?
【发布时间】:2021-10-11 17:59:06
【问题描述】:

我的应用使用核心数据来存储数据,它有多种配置:一种用于与 iCloud 同步,另一种用于本地数据。

我通过创建 2 个 NSPersistentStoreDescription 来做到这一点,然后将它们分配给容器:

container.persistentStoreDescriptions = [cloud, local]

这 2 个持久存储使用相同的模型和实体。 如果我想将 managedObject 添加到商店,我会在插入后和保存上下文之前使用此代码。

assignObject:toPersistentStore:

问题在于两个存储中所有获取的对象的列表中,有没有办法知道特定托管对象存储在哪个持久存储中?

【问题讨论】:

    标签: swift core-data


    【解决方案1】:

    对于任何感兴趣的人:您可以使用此行来获取持久存储甚至配置名称:

    managedObject.objectID.persistentStore?.configurationName 
    

    非常感谢来自 reddit 的 joro_estropia 的回答

    【讨论】:

      【解决方案2】:

      如果您将实体分配给模型文件中的多个配置,则该实体将保存到其描述具有这些配置之一的所有持久存储中。在您的情况下,本地存储和云存储都将存储新对象。

      编辑(见评论):

      我没有对此进行测试,但我相信它是这样工作的:
      你可能有一个NSPersistentCloudKitContainer 有一个persistentStoreCoordinator。协调器可以处理多个商店,在您的情况下是 local 商店和镜像到 iCloud 的 iCloud 商店。
      由于两种配置具有相同的实体,存储一个实体会将其存储在两个存储中,iCloud 存储更改会上传到 iCloud,并且可能会同步到其他设备。
      如果现在另一台设备修改了 iCloud 内容,这将镜像回您的应用程序,并且仅修改您的 iCloud 存储。现在由您来更新您的 local 存储以使您的数据库保持一致。
      这可以通过注册.NSPersistentStoreRemoteChange 通知来完成。如果您收到一个,您可以相应地更新您的 local 商店。
      当然,整个过程很容易出错,就像一个人将相同的信息存储在不同的地方一样。
      所以我的建议是只在一个商店中存储一个实体。

      【讨论】:

      • 感谢您的回答。所以您的意思是即使我将托管对象分配给本地存储,它也会保存在云存储中,但不会在设备之间同步?另外,托管对象会同时保存在 local.sqlite 和 cloud.sqlite 中?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 2011-08-16
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多