CoreData:从捆绑的数据库

时间:2015-11-13 13:39:28

标签: ios core-data bundle core-data-migration

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

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

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

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

更新

以下是方案

我将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的模式,以便数据库具有新的属性列。 现在我关心的是下一步,

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

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

2 个答案:

答案 0 :(得分:0)

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

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

  1. 有两个独立的数据库。一个数据库可以具有读写功能 数据和另一个只读数据。它们可以相互关联 使用获取的属性。在更新期间,更换或更新 只读数据库 - 同时保持读写完整。
  2. 使用后台线程更新数据库。更新代码将 拥有它自己的ManagedObjectContext - 但共享相同的内容 PersistentStore。同步主要的ManagedObjectContext 后台线程使用一些协议。
  3. 如果您选择从Web服务进行更新,则从后台线程更新的第二个选项可能会很有效。

    如果我还没有理解你的问题,请澄清。

答案 1 :(得分:0)

好的所以经过大量研究后我终于达到了目标,下面是我做过的步道和解决方案

Sol 1

  1. 在单独的数据库中具有只读和读写数据,这样我就可以安全地删除只读数据库,如果有任何主数据更新,我可以保护用户的数据,但考虑时间轴和约束我拥有,对我来说不可能。在此发布,以便它可以帮助他人。
  2. Sol 2

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

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

    - >使用_v2重命名捆绑的数据库并将其复制到Doc目录,现在我们在doc目录中有2个数据库 我拿了一些应用Importing large data sets

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

    - >工作得很好,现在我使用新的只读数据和来自旧数据库的用户数据获得了我的_v2数据库。

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

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

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

    - >我在这里没有想法了。

    Sol 3

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

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