0

我有一个 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. 轻量级迁移(使用相同的版本模型)-> 仍然看到版本 1.0 的值。

  2. 为具有相同方案的模型创建了一个新版本,创建了一个从模型 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]];
4

1 回答 1

2

您正在混淆迁移数据和迁移数据模型。核心数据迁移意味着您更改模型,即重命名实体属性或添加新实体等。

在您的情况下,您似乎只想更新该数据,这要简单得多。您可以通过以下方式之一进行:

编辑:在您澄清之后,这不再相关: 例如,您可以创建一个新存储并将其复制到文件系统级别的旧存储上。我认为这是粗略且容易出错的。

我首选的解决方案是检查版本(例如通过NSUserDefaults或通过获取),然后简单地获取所有相关实例,更新它们并保存。

于 2013-10-20T14:51:52.290 回答