CoreData:从绑定数据库迁移数据



我们的应用程序有一个基于单个核心数据模型的核心数据存储。既有只读数据,也有读写数据。

只读数据是预先加载的,并与应用程序捆绑在一起,因此在新安装时,该数据库会复制到应用程序沙盒中,然后通过Web服务更新数据库(即只有更改后的数据才会从Web服务更新,这样传输的数据就会减少)。

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

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

更新

这是一个场景,

我将X.sqlite与proj捆绑在一起(它有新的架构),如果doc-dir中没有X.sqlite,我会复制它,然后一切正常。现在在应用程序更新场景中,X.sqilte将已经存在于doc-dir,不会被复制,迁移助手将迁移架构。所以现在我们有了X.sqlite,它在doc-dir中有新的模式,但有旧的数据(没有新的属性)。现在我想知道的是,是否有办法将捆绑的X.sqlite中的数据与doc目录中的数据合并。我想知道是否有合并的过程。

更准确地说

以下是实体

*存储-只读

*产品-只读

*产品组-只读

*ShopList-基于用户的

所有这些都在同一个型号和同一家商店里。

现在Store/Products/ProductGroups有了额外的属性。

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

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

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

如果我理解你的问题:你想在应用程序更新期间更新只读数据,同时保留用户更改的读写数据。

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

  1. 有两个独立的数据库。一个数据库可以具有读写功能数据和另一个具有只读数据。他们可以相互联系使用提取的属性。在更新期间,替换或更新只读数据库--同时保持读写数据库不变
  2. 使用后台线程更新数据库。更新代码将拥有自己的ManagedObjectContext,但共享相同的持久存储。从中同步主ManagedObjectContext使用某种协议的后台线程

如果您选择从web服务更新,那么从后台线程更新的第二个选项可能会很好地工作。

如果我不理解你的问题,请澄清。

好的,经过大量的研究,我终于实现了我的目标,下面是我进行的跟踪和解决方案

Sol 1

  1. 将只读和读写数据放在单独的数据库中,这样,如果有任何主数据更新,我可以安全地删除只读数据库,并且我可以保护用户的数据,但考虑到我的时间表和限制,这对我来说是不可能的。在这里发帖,这样可能会帮助其他人

Sol 2

我想把捆绑数据库中的新数据合并到现有数据库中,而不是把现有数据库中的用户数据合并到新数据库中。以下是完成的步骤。-->创建了一个新的数据上下文。

-->创建了一个新的持久协调

-->用_v2重命名捆绑的数据库,并将其复制到Doc目录中,现在我们在Doc目录下有2个数据库我采取了一些应用程序导入大型数据集

-->现在使用ManagedObject克隆类别,我将所有用户信息数据从现有数据库复制到新数据库_v2。在此处找到类别NSManagedObject+克隆

-->工作得很好,现在我得到了我的_v2数据库,其中包含新的只读数据和来自旧数据库的用户数据。

-->现在我需要将控制权交还给默认的数据上下文

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

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

-->我在这里没什么想法了。

Sol 3

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

我从web服务收集了新的响应,并创建了一个JSON(不太大,只有1.5MB),并附加了应用程序捆绑包,对于更新应用程序的用户,我将在本地读取JSON数据,并对核心数据DB进行初始合并,在那里数据库将保持新的只读数据和用户数据不变。在初始合并之后,所有内容都将由在线同步处理。

最新更新