Magical Record 自定义核心数据迁移不提取现有数据

Posted

技术标签:

【中文标题】Magical Record 自定义核心数据迁移不提取现有数据【英文标题】:Magical Record Custom Core Data Migration not pulling existing data 【发布时间】:2015-10-15 22:15:50 【问题描述】:

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

在我之前使用的应用程序版本中

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

为了启用自动迁移,我已转而使用。

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

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

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

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

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 数据库中显示正确的数据,但所有与缺少其他三个模型。

出于故障排除的目的,我尝试为不同的模型创建映射模型,据我了解,这是不必要的。当我运行新应用程序时,该模型的数据就会出现,但不是之前的模型。

在新版本的应用程序中,我还将运行迁移的模型设置回原始模型,以确保其他数据正常通过,然后它会提取所有旧数据。

任何建议将不胜感激。

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

更新: 所以我在过去的 24 小时左右都在真正解决这个问题,并意识到当我开始这个问题时,我对实际发生的事情并没有很好的理解。所以我现在将用一个解决方案更好地解释它。

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

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

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

您可以通过打开查找器中的模型对象并将 xml 全部合并到一个文件中,将 xcdatamodeld1、2 和 3 手动合并到 xcdatamodeld4 中。当您下次启动核心数据存储时,它看起来好像什么都没有改变。

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

【问题讨论】:

【参考方案1】:

问题在于 Xcode 项目中有多个 xcdatamodeld 对象都存储到同一个 sqlite 存储中。

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

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

一旦你有了一个标准化的 xcdatamodeld 对象,你就可以像往常一样运行迁移。

【讨论】:

以上是关于Magical Record 自定义核心数据迁移不提取现有数据的主要内容,如果未能解决你的问题,请参考以下文章

应用程序通过 RestKit 和 Magical Record 滞后于巨大的核心数据映射

Magical Record 检测到默认上下文没有变化

Magical Record 因此消息而崩溃

CoreData + Magical Record 运行选择查询

ios Magical Record 保存在 UIApplicationWillTerminateNotification

使用 Magical Record 将对象数组插入 Core Data