我有一个 1.0 版本,目前在应用商店中分发。该版本使用1.0版本的模型。模型商店中的一些实体填充了预定义的数据,因此应用程序与已包含此数据的商店打包在一起,应用程序不允许用户更改这些实体(只读)。商店是 SQLite 类型。
我发现在 1.0 版中,实体(这些预定义实体之一)中有一个属性包含错误值(对于该实体的所有实例)。我想在 2.0 版中解决这个问题。
所以我想,对于 2.0 版,让我们更改模型内容,因此现在该实体的所有实例中的属性都将包含正确的值。所以我修改了商店(没有改变 scheme 的模型版本),所以它包含正确的值。
这是问题所在,如果我在从未安装过 1.0 版的设备上安装 2.0 版,我可以在应用程序中看到正确的值,一切正常。但是,如果我在 1.0 版(更新)之上安装 2.0 版,该应用程序仍会显示它在 1.0 版中显示的值。
我立即得出的结论是,新版本不会将新版本中的数据迁移到旧版本中的数据,感染,我在苹果文档中读到迁移通常是从旧商店到新商店完成的。而且由于旧商店包含错误的值,我在新商店也看到了它。
我得出一个结论,我必须定义一个迁移,以便在 2.0 版本中存储正确的值。
这是我尝试过的:
轻量级迁移(使用相同的版本模型)-> 仍然看到版本 1.0 的值。
为具有相同方案的模型创建了一个新版本,创建了一个从模型 1 映射到模型 2 的映射模型。
2.a. 使用映射模型进行迁移,该模型指定目标的属性由源的属性填充 -> 仍然看到 1.0 版的值。
2.b。使用没有属性规则的映射模型进行迁移 -> 仍然看到版本 1.0 的值
2.c。使用映射模型进行迁移,该模型指定目的地的属性填充目的地的属性 -> 仍然看到版本 1.0 的值
2.d。轻量级迁移 -> 仍然……</p>
我使用以下代码启动迁移:
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];