UIManagedDocument 的迁移问题

Posted

技术标签:

【中文标题】UIManagedDocument 的迁移问题【英文标题】:Migration issues with UIManagedDocument 【发布时间】:2012-03-19 13:24:13 【问题描述】:

我在斯坦福 CS193P 课程关于使用 ios 5 的新类 UIManagedDocument 之后开始在我的应用程序中使用 CoreData。该方法本身非常简单,但我无法理解如何处理我不断进行的模型修改。这就是我实例化 UIManagedDocument 对象的方式(在 appDelegate 中,以便其他所有类都可以使用它):

if (!self.database) 
    NSURL *url=[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    url = [url URLByAppendingPathComponent:@"AppName"];

    UIManagedDocument *doc = [[UIManagedDocument alloc] initWithFileURL:url];
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
    doc.persistentStoreOptions = options;
    self.database=doc;
    [doc release];

我遇到的问题是,即使每次更改 .xcdatamodel 的一点点,我都无法获取之前存储在文档中的所有内容,也无法创建任何新实例。事实上,这样做会产生以下异常:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation.'

我认为设置托管文档的“选项”属性可以解决问题,但显然这还不够。 任何人都可以帮忙吗?找不到其他真正符合我确切需求的问题。

【问题讨论】:

我也关注了斯坦福 CS193P,我遇到了同样的错误。 【参考方案1】:

在修改 Core Data 模型之前,您应该“添加模型版本”。

1。 选择原始模型文件。 (例如 YourProject.xcdatamodel)

2。 “编辑器”->“添加模型版本...”。然后添加一个新的模型版本(例如 2.0)

3。 您将获得一个新的模型文件。 (例如 YourProject 2.0.xcdatamodel)。修改它。

4。 更改当前模型版本。选择顶部的 .xcdtatmodel 文件 -> “查看” -> “实用程序” -> “显示文件检查器”。找到标签“Versioned Core Data Model”并选择您要修改的正确版本。

这也困扰了我很久很久。希望这种方式可以帮助到你^^

【讨论】:

嗨。谢谢你的回答。似乎是个好方法。无论如何,在遵循您的建议后,我不断遇到迁移问题:*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“无法将模型与名为“ManagedChild”的两个不同实体合并,其中 ManagedChild 是其中一个实体在我的模型中。我找到了这个entry,但它没有使用我需要的 samy UIManagedDocument 方法...... 我遇到了同样的问题。所有文档都说添加“persistentStoreOptions”是要走的路。但是我从 UIManagedDocument 获得了 nil 返回以及相同的错误消息。删除商店对我来说不是一个有效的选择,因为我支持已发布的应用程序。 只是另一个数据点...我创建了一个示例项目,它通过 UIManagedDocument 初始化核心数据,就像我在我的应用程序中所做的那样,但是示例项目似乎迁移得很好(即使没有任何持久存储选项)。【参考方案2】:

您的问题有一个非常简单的解决方案。只需从模拟器或设备中删除应用程序(触摸应用程序图标几秒钟,然后触摸应用程序图标开始摆动时出现的十字)。这样,Xcode 就会更新您应用的 UIManagedDocument。

【讨论】:

如果应用程序已经在商店中怎么办。您会显示警报视图并要求用户重新安装您的应用程序? 我认为 pH-k 的答案是提问者所需要的,因为他正在学习教程,而不是为了向商店发布应用程序:) 这对我没有帮助。它说永久存储不可用,但我显然拥有它!【参考方案3】:

确保您没有将 NSDocumentDirectory 错误地输入为 NSDocumentationDirectory。

   NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];

NSDocumentDirectory 是对的!

【讨论】:

以上是关于UIManagedDocument 的迁移问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Core Data 轻量级迁移和 UIManagedDocument 的“找不到源存储模型”

无法创建 UIManagedDocument

UIManagedDocument 和 NSFetchedResultsController

UIManagedDocument - 验证核心数据实体

UIManagedDocument 不保存到磁盘

在 UIManagedDocument 中禁用自动保存