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