2013-10-20 43 views
0

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

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

回答

2

你混合了迁移数据和迁移数据模型。核心数据迁移意味着你改变模型,即一个实体属性被重新命名或添加一个新的实体等。

就你而言,你似乎想要更新那个数据,这很简单。你可以做到这一点在下列方式之一:

编辑:你的澄清后,这是不相关的任何更多: 例如,你可以只让一个新的商店和其复制旧的文件系统上水平。我认为这是粗糙和容易出错的。

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

+0

我忘了说明一些重要的东西,旧商店已经包含了我喜欢为新版本保留的用户信息。如果我只是重写商店文件,我会错过这个目标。您的第二个建议可能会起作用,但仍然可以使用迁移获得相同的效果吗? – Yossi

+1

对不起,不 - 请阅读我的答案 - *数据*不是*型号*。你仍然误解了移民。我概述的**是**迁移。 SDK提供的是**模型迁移**。得到它了? – Mundi

+0

我同意@Mundi - 核心数据迁移模型,而不是它包含的数据..你最好的选择是编写一段代码,为你做数据迁移..这可以在应用程序首次启动时运行更正您的数据。 – Sharath

相关问题