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

标签 ios objective-c core-data migration

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

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

[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 数据库中显示正确的数据,但与其他三个型号不见了。

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

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

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

注意:这一切都是在设备上的 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 中。当您下次启动核心数据存储时,它似乎没有任何变化。

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

最佳答案

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

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

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

假设您拥有一个规范化的 xcdatamodeld 对象,您就可以像往常一样运行迁移。

关于ios - 神奇记录自定义核心数据迁移不拉现有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33159423/

相关文章:

ios - "Missing __block type specifier"重构代码后编译错误但重构前正常

ios - 网络调用后绑定(bind)到 UIRefreshControl

objective-c - RestKit 对象映射 : difficulty using setObjectMapping:forResourcePathPattern:withFetchRequestBlock

objective-c - 如何在 iPad 的单 View 应用程序中以编程方式正确实例化和显示 View

iphone - Restkit内存不足警告

ios - 核心数据确保数据唯一性

ios - 将 CoreData 实现到 TableView 时出现问题

objective-c - MKNetworkKit - 显示缓存的图像

iphone - 如何调整 UIToolBar 左右内边距

Swift 中的 UITableViewCell