需要一些有关如何使用新的一对多关系设置核心数据迁移的信息

Posted

技术标签:

【中文标题】需要一些有关如何使用新的一对多关系设置核心数据迁移的信息【英文标题】:Need some info on how to set up core data migration with a new 1-to-many relationship 【发布时间】:2013-12-30 06:22:30 【问题描述】:

关于核心数据迁移的问题:

原始模型只是具有多个属性的单个实体(事务)。该应用程序可以存储 N 个事务,并将它们显示在一个表格中。

原始核心数据模型(简化):

Transaction:
    property_x
    property_y
    property_z

模型现在已更改,新的***实体是一个 TransactionsList 实体,具有一对多的关系,因此每个 TransactionsList 都有多个 Transaction。

新的核心数据模型(简化):

TransactionsList:
    property_a
    property_b
    transactions <-->> Transaction:
                                property_x
                                property_y
                                property_z
                             <- transactionList

模型现在已更改,因此***实体是 TransactionsList 实体,具有一对多关系(事务),因此每个 TransactionsList 都有多个事务。

我在查找如何设置从原始配置迁移到此新配置的任何示例(在 Apple 文档中或在 Web 上)时遇到问题。

轻量级迁移似乎不起作用(因为此更改涉及添加新关系)。

我设置了一个映射文件,并尝试创建自定义迁移策略,但如果我在其中的任何函数上设置断点,它们将永远不会被命中。

我打开了迁移调试,提示迁移成功:

“自动模式迁移成功,用于存储在“...”

但是,如果我查看 sqlite 数据库的内部结构,则没有 TransactionsList 实体的数据库条目,并且 Transactions 中的所有 transactionList 字段(应该链接到拥有的 TransactionsList)都是空的。

两个问题...

1) 关于为什么我的自定义实体迁移策略可能没有被调用的任何线索

2) 对设置此类迁移的最佳方式有何建议?

谢谢。

【问题讨论】:

【参考方案1】:

您是正确的,轻量级迁移将不起作用。此外,大量迁移在计算上会非常昂贵,我不建议这样做。

我建议采用两步法:

    允许进行轻量级迁移。这将导致您的 TransactionList 实体为空。 迁移后,遍历您的事务并酌情创建TransactionList 实体。

这将比使用大量迁移更快、更容易测试/调试。您可以使用-[NSManagedObjectModel isConfiguration: compatibleWithStoreMetadata:] 方法测试是否需要进行迁移。这会让您知道需要迁移,然后您开始迁移并最终进行后期处理。

【讨论】:

我听取了您的建议,如果没有 TransactionList 实体(如果需要迁移,则会出现这种情况),我只是执行了 Transaction 实体的获取,添加了一个 TransactionList 实体,然后遍历Transaction 实体,将数据复制到 TransactionList 中(通过我用于添加新事务的普通 API),然后删除原始事务(因为不再需要它们)。它似乎工作正常,并且比尝试进行大量迁移工作要简单得多。感谢您的建议。

以上是关于需要一些有关如何使用新的一对多关系设置核心数据迁移的信息的主要内容,如果未能解决你的问题,请参考以下文章

涉及新实体和一对多关系的核心数据迁移

核心数据一对多关系在获取新对象后失去关系[重复]

核心数据:迁移具有自引用属性的实体

如何使用 Objective-C 将一对多关系数据保存到核心数据中

了解一对多的核心数据删除规则

在插入新的子对象时,父子对象传递与多级的一对多关系。 IOS核心数据