CoreData:从捆绑的数据库迁移数据

我们的应用程序有一个基于单个coredata模型的coredata商店。 有只读数据和读写数据。

只读数据与应用程序一起预先加载和捆绑,以便在全新安装时,将此数据库复制到应用程序沙箱,并从那里通过webservice更新数据库(即仅更改的数据将从webservice获得更新,以便传输更少的数据)。

现在我们需要向只读实体添加更多属性。

轻量级迁移将有助于轻松升级架构,但问题在于新数据,因为我们向所有只读实体添加新属性,所有数据记录都被更改,Web服务同步可能需要很长时间下载和更新数据。 为了避免这种情况,我们将更新的数据与应用程序捆绑在一起(这将解决全新安装的问题)。 但是对于正在升级应用程序的用户,有一种标准机制可以从捆绑的数据库中复制只读实体,并将这些实体更新到沙箱中的现有数据库,以便它们获取更新的只读数据以及读取的数据。 – 写数据保持不变。

UPDATE

这是场景,

我有X.sqlite与proj捆绑(它有新架构),如果在doc dir中没有X.sqlite我然后复制它并从那里一切正常。 现在,在App更新方案中,X.sqilte将已存在于doc dir中,不会被复制,迁移助手将迁移该架构。 所以现在我们在doc dir中使用新模式的X.sqlite但是旧数据(没有新属性)。 现在我想知道的是,是否有办法将捆绑的X.sqlite中的数据与doc dir中的数据合并。 我想知道是否有合并的过程。

更确切地说

以下是实体

*商店 – ReadOnly

*产品 – ReadOnly

* ProductGroups – ReadOnly

* ShopList – 基于用户

所有产品都在同一型号和同一商店。

现在,商店/产品/产品组具有额外的属性。

轻量级迁移器将迁移X.Sqlite的模式,以便DB具有新的属性列。 现在我关心的是下一步,

让我们以商店为例。 商店有两个新属性纬度和经度。 现在问题如何复制数据? 步骤

使用diff名称将捆绑的数据库复制到doc目录? 创建一个新的持久性协调员? 读取捆绑的数据并获取对象? 然后遍历现有的数据库?

如果我理解了您的问题:您希望在应用更新期间更新只读数据 – 同时保留用户已完整更改的读写数据。

有几种方法可以实现这一目标:

  1. 有两个独立的数据库。 一个数据库可以具有读写数据,另一个数据库具有只读数据。 它们可以使用获取的属性相互关联。 在更新期间,替换或更新只读数据库 – 同时保持读写一个完整。
  2. 使用后台线程更新数据库。 更新代码将拥有自己的ManagedObjectContext – 但共享相同的PersistentStore。 使用某些协议从后台线程同步主ManagedObjectContext。

如果您选择从Web服务更新,则从后台线程更新的第二个选项可能会很好。

如果我不了解您的问题,请澄清。

好的,所以经过大量的研究,我实现了我的目标,下面是我所做的步道和解决方案

索尔1

  1. 将读取和读写数据放在不同的数据库中,这样我就可以安全地删除readonly db,如果有任何主数据更新,我可以保护用户的数据,但考虑到我的时间表和约束,它不会是对我来说可能。 在此发布,以便它可以帮助其他人。

索尔2

我想将捆绑数据库中的新数据合并到现有数据库,我想将现有数据库中的用户数据合并到新数据库。 以下是完成的步骤。 – >创建了一个新的datacontext。

– >创建了一个新的持久性协调员

– >用_v2重命名捆绑的数据库并将其复制到Doc目录,现在我们在doc目录中有2个数据库我拿了一些app 导入大数据集

– >现在使用ManagedObject克隆类别,我将所有用户信息数据从现有数据库复制到新的db _v2。 在这里找到NSManagedObject + Clone的类别

– >工作正常,现在我的_v2数据库包含新的只读数据和来自旧数据库的用户数据。

– >现在我需要将控制权交还给默认的datacontext

– >我试图将旧上下文的PSC更改为新的PSC,但系统不允许我这样做。

– >然后我尝试将旧上下文的持久性存储更改为新存储,但是我收到错误,说数据库已经存在。 ( migratePersistentStore:toURL:options:withType:error:

– >我的想法用完了。

索尔3

然后,我与其他一些同事讨论了我的问题,他们建议以不同的格式提供新数据,这些数据很严重。 正如我已经提到的,我的应用程序有逻辑将新数据下载为JSON并将其合并到核心数据,为什么我可以提供带有新数据的JSON文件以及我的应用程序?

我收集了来自web服务的新响应并创建了一个JSON(不大只有1.5MB)并附加了应用程序包,对于更新应用程序的用户而不是核心数据合并,我将在本地读取JSON数据并进行初始合并对于核心数据DB,数据库将具有新的只读数据和用户数据。 初始合并后,所有内容都将通过在线同步进行处理。