我正在尝试在Core Data Model上执行自定义迁移,但是唯一要迁移的数据是与自定义迁移相关联的数据。
在我的应用程序的上一版本中,我正在使用
[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存储中。现在基于我所读到的创建多个xcdatamodelds并不一定是件坏事,但你需要确保将它们存储在自己的sqlite商店中。
所以,我找到/提出的解决方案实际上非常简单。由于我将所有数据存储在同一个sqlite存储中,因此我能够将所有xcdatamodeld对象合并为一个。
假设您有4个xcdatamodeld对象。 xcdatamodeld1,2,3和4.
您可以通过打开位于finder中的模型对象并将xml all合并到一个文件中,将xcdatamodeld1,2和3手动合并到xcdatamodeld4中。下次启动核心数据存储时,似乎没有任何变化。
之后,您可以像往常一样运行迁移。
答案 0 :(得分:1)
问题是Xcode项目中有多个xcdatamodeld对象都被存储到同一个sqlite存储中。
要解决此问题,我通过在finder中打开模型对象,在文本编辑器中打开contents文件夹,复制xml实体对象并将元素项合并到指定的文件对象,手动合并一个模型对象中的所有xcdatamodeld对象模型。
然后删除现在包含在合并的xcdatamodeld中的旧xcdatamodeld对象。
如果有,请说一个规范化的xcdatamodeld对象,您可以像往常一样运行迁移。