神奇记录自定义核心数据迁移不拉现有数据

Magical Record Custom Core Data Migration not pulling existing data

我正在尝试对核心数据模型执行自定义迁移,但唯一要迁移的数据是与自定义迁移关联的数据。

我使用的是以前版本的应用程序

[MagicalRecord setupCoreDataStackWithStoreNamed:@"xxxxxx.sqlite"];

为了启用自动迁移,我已经切换到使用。

[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"MTDataStore.sqlite"];

在新的应用程序版本中,我还创建了一个新的模型版本、一个映射模型和一个用于迁移的自定义转换策略。现有版本共有4个模型

对模型的更改包括为一个实体添加的属性,该属性应由自动迁移设置处理。另一个变化是从实体中删除 4 个属性(attr1、attr2、attr3、attr4)并向该实体添加一个属性(键)。然后我将旧属性映射到新属性 'key',这是一个字符串。

这是我为转换策略所针对的 'key' 属性设置的值表达式。

FUNCTION($entityPolicy, "keyToJSONString:" , $source)

这是转换策略中的代码。

-(NSString*)keyToJSONString:(MTWirelessCDKey*)wirelessCDKey
{
    NSString *lengthJSON = [MTUtility JSONString:wirelessCDKey.length];
    NSString * jsonKey = [NSString stringWithFormat:@"{\"gauge\":\"%@\",\"length\":\"%@\",\"diam\":\"%@\",\"head\":\"%@\"}",
                          wirelessCDKey.attr1,
                          lengthJSON,
                          wirelessCDKey.attr2,
                          wirelessCDKey.attr3];
    return jsonKey;
}

当我 运行 使用 Xcode 应用程序的新版本时,在旧版本上安装时,具有映射模型和自定义转换策略的模型在我的应用程序中显示了正确的数据sqlite 数据库,但与其他三个模型相关的所有数据都丢失了。

出于故障排除目的,我尝试为不同的模型创建映射模型,据我所知,这是不必要的。当我 运行 新应用程序时,该模型的数据就会过来,但不是以前工作的模型。

在新版本的应用程序中,我还设置了我正在迁移的模型运行回到原来的模型,只是为了确保其他数据顺利通过,然后将所有数据都拉过来旧数据。

如有任何建议,我们将不胜感激。

注意:这一切都是在 Objective-c 的 Xcode 7 (iOS 9 SDK) 设备上完成的。

更新: 所以我花了大约 24 小时来真正解决这个问题,并意识到当我开始这个问题时我并没有很好地理解实际发生的事情。所以我现在要用一个解决方案更好地解释它。

最初创建项目时,我设置了 4 个不同的 xcdatamodeld 引用。所有这些最终都存储在同一个 sqlite 存储中。现在,根据我读过的内容,创建多个 xcdatamodelds 不一定是坏事,但您需要确保将它们分别存储在自己的 sqlite 存储中。

所以,我发现/提出的解决方案实际上非常简单。由于我将所有数据存储在同一个 sqlite 存储中,因此我能够将所有 xcdatamodeld 对象合并为一个。

假设您有 4 个 xcdatamodeld 对象。 xcdatamodeld1、2、3 和 4。

您可以通过打开位于查找器中的模型对象并将 xml 全部合并到一个文件中,将 xcdatamodeld1、2 和 3 手动合并到 xcdatamodeld4 中。当您下次启动核心数据存储时,它似乎没有任何变化。

之后您可以 运行 像往常一样进行迁移。

问题是 Xcode 项目中有不止一个 xcdatamodeld 对象,它们都存储在同一个 sqlite 存储中。

为了解决这个问题,我手动将所有 xcdatamodeld 对象合并到一个模型对象中,方法是在查找器中打开模型对象,在文本编辑器中打开内容文件夹,复制 xml 实体对象并合并元素项目到指定的模型。

然后删除现在包含在合并的 xcdatamodeld 中的旧 xcdatamodeld 对象。

一旦你有了,比如说一个规范化的 xcdatamodeld 对象,你就可以像往常一样 运行 迁移。