CoreData:Migrate 来自捆绑数据库的数据
CoreData:Migrate data from bundled db
我们的应用程序有一个基于单个核心数据模型的核心数据存储。有只读数据,也有读写数据。
只读数据已预加载并与应用程序捆绑在一起,因此在全新安装时,此数据库将复制到应用程序沙箱,并从那里通过网络服务更新数据库(即只有更改的数据会从 web 服务更新,以便传输更少的数据。
现在我们需要向只读实体添加更多属性。
轻量级迁移将有助于轻松升级架构,但问题是关于新数据,因为我们正在为所有只读实体添加新属性,所有数据记录都已更改并且网络服务同步可能花很多时间下载和更新数据。为避免这种情况,我们将更新的数据与应用程序捆绑在一起(这将解决全新安装的问题)。但是对于正在升级应用程序的用户来说,是否有一种标准机制可以从捆绑的数据库中复制只读实体并将其更新到沙箱中的现有数据库,以便他们将获得更新的只读数据以及他们的读取-写入数据保持不变。
更新
场景是这样的,
我将 X.sqlite 与 proj(具有新模式)捆绑在一起,如果 X.sqlite 不在 doc 目录中,然后我将其复制并从那里一切正常。现在在应用更新场景中,X.sqilte 已经存在于 doc 目录中,不会被复制,迁移助手将迁移 schema。所以现在我们在 doc 目录中有 X.sqlite 新模式但旧数据(没有新属性)。现在我想知道的是,是否有一种方法可以将捆绑的 X.sqlite 中的数据与 doc 目录中的数据合并。我想知道有没有合并的过程
更准确地说
以下是实体
*商店 - 只读
*产品 - 只读
*产品组 - 只读
*ShopList - 基于用户
都是同一个型号,同一个店。
现在商店/产品/产品组有额外的属性。
轻量级迁移器将迁移 X.Sqlite 的架构,以便数据库将具有新的属性列。
现在我关心的是下一步,
我们以商店为例。 Store 有两个新属性 latitude 和 logitude。现在的问题是如何复制数据?步骤
正在将捆绑的数据库复制到具有差异名称的文档目录?
创建一个新的持久性协调器?
读取捆绑数据并获取对象?
然后遍历现有的数据库?
如果我理解你的问题:你想在应用程序更新期间更新只读数据——同时保留用户已更改的读写数据完好无损。
有几种方法可以实现:
- 有两个独立的数据库。一个数据库可以有读写
数据和另一个只读数据。他们可以相互关联
使用获取的属性。在更新过程中,更换或更新
只读数据库——同时保留读写数据库。
- 使用后台线程更新数据库。更新代码将
拥有自己的 ManagedObjectContext——但共享相同的
持久存储。从同步主 ManagedObjectContext
使用某种协议的后台线程。
如果您选择从您的 Web 服务更新,则从后台线程更新的第二个选项可能效果很好。
如果我没有理解你的问题,请澄清。
好的,经过大量研究,我终于实现了我的目标,以下是我所做的足迹和解决方案
太阳 1
- 将只读和读写数据放在不同的数据库中,这样如果有任何主数据更新我可以安全地删除只读数据库并且我可以保护用户数据,但考虑到我的时间线和限制有,这对我来说是不可能的。在这里张贴,以便它可以帮助其他人。
太阳 2
我想尝试将捆绑数据库中的新数据合并到现有数据库中,我想将现有数据库中的用户数据合并到新数据库中。以下是完成的步骤。
--> 创建了一个新的数据上下文。
--> 创建了一个新的持久协调器
--> 将捆绑的数据库重命名为 _v2 并将其复制到 Doc 目录,现在 doc 目录中有 2 个数据库
我拿了一些应用 Importing large data sets
--> 现在使用 ManagedObject 克隆类别,我将所有用户信息数据从现有数据库复制到新数据库 _v2。在此处找到类别 NSManagedObject+Clone
--> 工作正常,现在我得到了我的 _v2 数据库,其中包含新的只读数据和来自旧数据库的用户数据。
--> 现在我需要将控制权交还给默认数据上下文
--> 我试图将旧上下文的 PSC 更改为新的 PSC,但系统不允许我这样做。
--> 然后我尝试将旧上下文的持久性存储更改为新存储,但我收到错误消息说数据库已经存在。 (migratePersistentStore:toURL:options:withType:error:
)
--> 我运行 没主意了。
太阳 3
然后我与其他一些同事讨论了我的问题,他们建议以不同的格式提供新数据,结果很成功。正如我已经提到的,我的应用程序具有将新数据下载为 JSON 并将其合并到核心数据的逻辑,为什么我可以提供包含新数据的 JSON 文件以及我的应用程序?
我从 web 服务收集了新的响应并创建了一个 JSON(不大,只有 1.5MB)并附加了应用程序包,对于更新应用程序的用户,我将阅读而不是核心数据合并JSON 本地数据 并进行初始合并到核心数据数据库,数据库将拥有新的只读数据和完整的用户数据。初始合并后,一切都将由在线同步处理。
我们的应用程序有一个基于单个核心数据模型的核心数据存储。有只读数据,也有读写数据。
只读数据已预加载并与应用程序捆绑在一起,因此在全新安装时,此数据库将复制到应用程序沙箱,并从那里通过网络服务更新数据库(即只有更改的数据会从 web 服务更新,以便传输更少的数据。
现在我们需要向只读实体添加更多属性。
轻量级迁移将有助于轻松升级架构,但问题是关于新数据,因为我们正在为所有只读实体添加新属性,所有数据记录都已更改并且网络服务同步可能花很多时间下载和更新数据。为避免这种情况,我们将更新的数据与应用程序捆绑在一起(这将解决全新安装的问题)。但是对于正在升级应用程序的用户来说,是否有一种标准机制可以从捆绑的数据库中复制只读实体并将其更新到沙箱中的现有数据库,以便他们将获得更新的只读数据以及他们的读取-写入数据保持不变。
更新
场景是这样的,
我将 X.sqlite 与 proj(具有新模式)捆绑在一起,如果 X.sqlite 不在 doc 目录中,然后我将其复制并从那里一切正常。现在在应用更新场景中,X.sqilte 已经存在于 doc 目录中,不会被复制,迁移助手将迁移 schema。所以现在我们在 doc 目录中有 X.sqlite 新模式但旧数据(没有新属性)。现在我想知道的是,是否有一种方法可以将捆绑的 X.sqlite 中的数据与 doc 目录中的数据合并。我想知道有没有合并的过程
更准确地说
以下是实体
*商店 - 只读
*产品 - 只读
*产品组 - 只读
*ShopList - 基于用户
都是同一个型号,同一个店。
现在商店/产品/产品组有额外的属性。
轻量级迁移器将迁移 X.Sqlite 的架构,以便数据库将具有新的属性列。 现在我关心的是下一步,
我们以商店为例。 Store 有两个新属性 latitude 和 logitude。现在的问题是如何复制数据?步骤
正在将捆绑的数据库复制到具有差异名称的文档目录? 创建一个新的持久性协调器? 读取捆绑数据并获取对象? 然后遍历现有的数据库?
如果我理解你的问题:你想在应用程序更新期间更新只读数据——同时保留用户已更改的读写数据完好无损。
有几种方法可以实现:
- 有两个独立的数据库。一个数据库可以有读写 数据和另一个只读数据。他们可以相互关联 使用获取的属性。在更新过程中,更换或更新 只读数据库——同时保留读写数据库。
- 使用后台线程更新数据库。更新代码将 拥有自己的 ManagedObjectContext——但共享相同的 持久存储。从同步主 ManagedObjectContext 使用某种协议的后台线程。
如果您选择从您的 Web 服务更新,则从后台线程更新的第二个选项可能效果很好。
如果我没有理解你的问题,请澄清。
好的,经过大量研究,我终于实现了我的目标,以下是我所做的足迹和解决方案
太阳 1
- 将只读和读写数据放在不同的数据库中,这样如果有任何主数据更新我可以安全地删除只读数据库并且我可以保护用户数据,但考虑到我的时间线和限制有,这对我来说是不可能的。在这里张贴,以便它可以帮助其他人。
太阳 2
我想尝试将捆绑数据库中的新数据合并到现有数据库中,我想将现有数据库中的用户数据合并到新数据库中。以下是完成的步骤。 --> 创建了一个新的数据上下文。
--> 创建了一个新的持久协调器
--> 将捆绑的数据库重命名为 _v2 并将其复制到 Doc 目录,现在 doc 目录中有 2 个数据库 我拿了一些应用 Importing large data sets
--> 现在使用 ManagedObject 克隆类别,我将所有用户信息数据从现有数据库复制到新数据库 _v2。在此处找到类别 NSManagedObject+Clone
--> 工作正常,现在我得到了我的 _v2 数据库,其中包含新的只读数据和来自旧数据库的用户数据。
--> 现在我需要将控制权交还给默认数据上下文
--> 我试图将旧上下文的 PSC 更改为新的 PSC,但系统不允许我这样做。
--> 然后我尝试将旧上下文的持久性存储更改为新存储,但我收到错误消息说数据库已经存在。 (migratePersistentStore:toURL:options:withType:error:
)
--> 我运行 没主意了。
太阳 3
然后我与其他一些同事讨论了我的问题,他们建议以不同的格式提供新数据,结果很成功。正如我已经提到的,我的应用程序具有将新数据下载为 JSON 并将其合并到核心数据的逻辑,为什么我可以提供包含新数据的 JSON 文件以及我的应用程序?
我从 web 服务收集了新的响应并创建了一个 JSON(不大,只有 1.5MB)并附加了应用程序包,对于更新应用程序的用户,我将阅读而不是核心数据合并JSON 本地数据 并进行初始合并到核心数据数据库,数据库将拥有新的只读数据和完整的用户数据。初始合并后,一切都将由在线同步处理。