我们的应用程序有一个基于单个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?
答案 0 :(得分:0)
如果我理解了您的问题:您希望在应用更新期间更新只读数据 - 同时保留用户已完整更改的读写数据。
有几种方法可以实现这一目标:
如果您选择从Web服务进行更新,则从后台线程更新的第二个选项可能会很有效。
如果我还没有理解你的问题,请澄清。
答案 1 :(得分:0)
好的所以经过大量研究后我终于达到了目标,下面是我做过的步道和解决方案
Sol 1
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进行初始合并,数据库将具有新的只读数据和用户数据。在初始合并之后,所有内容都将通过在线同步进行处理。