迁移/更新核心数据应用程序而不删除用户数据!

时间:2010-05-01 16:32:25

标签: iphone sql database core-data migration

我有一个非常复杂的问题,我想与你分享,也许有人可以为我解答。 在我开始之前,我必须说我在这方面很新。

所以,我有一个使用预先填充的SQL数据库的coredata iphone应用程序(很像食谱应用程序)。 用户可以添加/编辑自己的数据,但无法删除默认数据。 useres数据全部保存在同一个sql数据库中。

问题: 我需要做什么才能: - 更新存储在sql数据库中的一些(不是全部)默认数据而不“触摸”用户的数据? (模型将保持不变 - 没有新的实体等 - ) (如果用户卸载应用程序,然后重新安装新版本,一切都会好的,但显然我不想这样做。)

有人可以帮助编码吗?

3 个答案:

答案 0 :(得分:2)

为了支持稍后添加新实体等,您需要使用版本控制和自动轻量级迁移,如下所述:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmLightweight.html#//apple_ref/doc/uid/TP40008426-SW1

基本上,您使用Xcode中的Design->Data Model菜单项创建数据模型的新版本,然后进行一些代码更改。这将导致Core Data自动将旧模型迁移到较新模型。您可以进行哪些类型的更改。您可以添加新实体,并将可选属性添加到现有实体,或者将默认值设置为必需属性。

让我感到震惊的一件事是,当您想要使用版本控制和迁移时,加载核心数据NSManagedObjectModel的方式会发生变化。如果没有迁移,你可能会这样:

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

开始使用版本控制和迁移后,需要将其更改为:

NSString *path = [[NSBundle bundleForClass:self.class] pathForResource:@"DataModelName"
                                                                ofType:@"momd"];
NSURL *url = [NSURL fileURLWithPath:path];
NSManagedObjectModel *model = [[[NSManagedObjectModel alloc] initWithContentsOfURL:url] autorelease];

答案 1 :(得分:1)

核心数据明确支持模型版本控制,并提供在版本之间迁移数据的工具。这应该包含您需要的信息。 Link to Developer Docs for Migration

答案 2 :(得分:0)

由于您输入了默认数据,因此您必须知道这些记录的ID /密钥。您只需要一个可以更改默认数据的更新脚本。