如何检查托管对象存储在哪个持久存储中?

Posted

技术标签:

【中文标题】如何检查托管对象存储在哪个持久存储中?【英文标题】: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:

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

【问题讨论】:

【参考方案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 中?

以上是关于如何检查托管对象存储在哪个持久存储中?的主要内容,如果未能解决你的问题,请参考以下文章

一个托管对象上下文的两个持久存储 - 可能吗?

区分从内存中托管对象上下文和持久存储中获取的对象

为啥使用 Core Data 的人想要在同一个托管对象模型中使用多个持久存储?

两个托管对象上下文可以共享一个持久存储协调器吗?

持久存储迁移失败缺少源托管对象模型

核心数据 - 如何初始化对象但不将其添加到持久存储?