【问题标题】:migrate/ update core data app without erasing user data!在不删除用户数据的情况下迁移/更新核心数据应用程序!
【发布时间】:2010-05-01 16:32:25
【问题描述】:

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

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

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

有人可以在编码方面提供帮助吗?

【问题讨论】:

  • 似乎是 stackoverflow.com/questions/2750614/…">2750614 的副本,几分钟前才问过。
  • 我想我的问题比一个小时更新!!!大声笑,有趣和令人鼓舞的是,我不是唯一一个遇到同样问题的人。

标签: iphone sql database core-data migration


【解决方案1】:

为了支持稍后添加新实体等,您希望使用此处描述的版本控制和自动轻量级迁移:

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];

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的快速回复。但是我的问题略有不同,我将不胜感激一些教程链接或一些代码开始。我已经看到你给巴士的链接我不得不说我有点厚,不要安静地得到它。提前感谢您提供的所有信息...
    【解决方案3】:

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

    【讨论】:

    • 我已经成功地更新了我的默认数据,方法是用新的更新的 sql 替换旧的 sql。但是我丢失了所有用户输入的数据。我将不胜感激更详细(如果可能)的答案/教程,以指导我找到解决方案。再次感谢您的宝贵时间!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多