具有核心数据的多个持久性存储

Posted

技术标签:

【中文标题】具有核心数据的多个持久性存储【英文标题】:multiple persistence stores with core data 【发布时间】:2016-03-21 11:37:00 【问题描述】:

我正在开发应用程序,我必须在其中创建特定书柜的备份并必须稍后恢复。

有多个衣橱,每个衣橱都有多本书,每本书都有多个章节等等。在核心数据中,我使用单个持久性存储来保存我的数据。实体具有一对一、对多和多对多类型的关系。

应用程序中的一个要求是将衣橱与服务器同步。用户可以更新衣橱、书籍和问题等。

我想要的是在将数据同步到服务器之前,我想备份一个特定的衣橱,我需要与服务器同步,包括所有关系等。这样我可以稍后在需要时恢复该衣橱。

需要恢复,因为多个用户可以同步同一个衣橱,因为同步后的数据与同步前的数据不同。

我阅读了这个 SO 链接,但没有通过太多。任何帮助,将不胜感激。 How can I duplicate, or copy a Core Data Managed Object?

我应该使用多个持久性存储吗?

【问题讨论】:

【参考方案1】:

您的要求最好在核心数据之外处理,就像您在整个数据存储中保存一个检查点一样,因此您不想复制数据存储中的项目,而是希望将整个数据存储复制为单个实体。

为此,您可以将数据存储的每个“副本”存储在不同的文件夹中,例如文件夹 workingv1v2(您可以决定如何管理版本)。当您要复制时,您将保存working 版本,然后使用NSFileManagerworking 文件夹中的所有文件复制到v3

注意,您的数据存储区可能存储为多个文件,因此不要简单地尝试自行复制 .sqlite 文件。

要恢复旧版本,您将销毁当前存储中的所有上下文和托管对象,然后复制要恢复的版本,替换当前的 working 文件夹。

【讨论】:

不应该有一个简单的方法来处理这个。我的意思是我不能只从实体中备份一条记录并稍后恢复吗?就像在 Sql 中一样,我们可以使用 sql 查询来备份单个记录,然后我们可以根据备份的数据进行更新? 如果需要,您可以使用自己的方案复制单个托管对象的所有详细信息 - 核心数据并非专门针对这一点设计

以上是关于具有核心数据的多个持久性存储的主要内容,如果未能解决你的问题,请参考以下文章

具有全局持久存储的基于核心数据文档的应用程序

具有单个持久存储协调器的多个数据模型

创建一个核心日期实体实例但不希望它被存储(非持久性)

核心数据迁移问题:“持久存储迁移失败,缺少源托管对象模型。”

应用存储和持久化数据卷:核心知识

从零开始入门 K8s | 应用存储和持久化数据卷:核心知识