我有一个版本1.0,目前分布在应用商店中。该版本使用版本1.0的模型。模型商店中的一些实体会填充预定义数据,因此应用程序打包时商店已经包含这些数据,应用程序不会让用户更改这些实体(只能读取)。该商店是SQLite类型的。IOS核心数据 - 无法在具有相同方案的两个模型之间迁移数据
我发现在版本1.0中,实体(其中一个预定义实体)中包含一个包含错误值(针对此实体的所有实例)的属性。我想在2.0版中解决这个问题。
因此,我认为,对于2.0版本,可以更改模型内容,以便现在所有实例中的属性都将包含正确的值。所以我修改了商店(没有更改方案的模型版本),因此它包含正确的值。
这是问题,如果我在从未有版本1.0的设备上安装2.0版,我可以在应用程序内部看到正确的值,并且一切正常。但是,如果我在版本1.0(更新)的顶部安装2.0版本,该应用程序仍然会显示它在版本1.0中显示的值。
我的直接结论是,新版本不会将新版本中的数据迁移到旧版本中的数据,Infect,我在苹果文档中读到迁移通常是从旧商店到新商店完成的。而且由于旧店铺包含错误的价值,我也在新店中看到它。
我得出结论,我必须定义一个迁移,以便在版本2.0中存储正确的值。
这里是我的尝试:
轻量级迁移(使用相同版本的模型停留) - >仍然可以看到的版本1.0的值。
创建了具有相同的方案,他的模型的新版本,创造了从模型1映射的映射模型到模型2.
2.A.使用映射模型进行迁移,该模型指定目标中的属性填充了源的属性 - >仍然可以看到版本1.0的值。
2.b.使用没有规则属性的映射模型进行迁移 - >仍然可以看到版本1.0的值
2.c.使用映射模型进行迁移,该映射模型指定在目的地的属性填充目标的属性 - >仍然看到版本1.0的值
2.d.重量轻迁移 - >还是......
我使用下面的代码来启动迁移:
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
我忘了说明一些重要的东西,旧商店已经包含了我喜欢为新版本保留的用户信息。如果我只是重写商店文件,我会错过这个目标。您的第二个建议可能会起作用,但仍然可以使用迁移获得相同的效果吗? – Yossi
对不起,不 - 请阅读我的答案 - *数据*不是*型号*。你仍然误解了移民。我概述的**是**迁移。 SDK提供的是**模型迁移**。得到它了? – Mundi
我同意@Mundi - 核心数据迁移模型,而不是它包含的数据..你最好的选择是编写一段代码,为你做数据迁移..这可以在应用程序首次启动时运行更正您的数据。 – Sharath