UIManagedDocument的迁移问题

6

我开始在我的应用程序中使用CoreData,遵循斯坦福大学CS193P课程关于使用iOS 5的新类UIManagedDocument的指导。这种方法本身非常简单,但我不知道如何处理我一直在进行的模型修改。这是我实例化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.'

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


我也跟着斯坦福CS193P学习,现在遇到了同样的错误。 - coolcool1994
3个回答

2
在修改您的Core Data模型之前,应该“添加模型版本”。
1.选择原始模型文件。 (例如YourProject.xcdatamodel)
2.“编辑器”->“添加模型版本...”。然后添加一个新的模型版本(例如2.0)
3.你会得到一个新的模型文件。(例如YourProject 2.0.xcdatamodel)。修改它。
4.更改当前模型版本。选择顶部的.xcdtatmodel文件->“查看”->“实用工具”->“显示文件检查器”。找到“有版本的Core Data模型”标签,并选择您想要修改的正确版本。
这也让我困扰了很长一段时间。希望这种方式可以帮助您^^

嗨。感谢您的回答。看起来这是一个好方法。无论如何,在遵循您的建议后,我仍然遇到了迁移问题:*** Terminating app due to uncaught exception 'NSInvalidArgumentException',reason:'Can't merge models with two different entities named 'ManagedChild''其中ManagedChild是我的模型中的实体之一。我找到了这个条目,但它没有使用我需要的相同UIManagedDocument方法... - micamoita
我遇到了同样的问题。所有文档都说添加“persistentStoreOptions”是正确的方法。但是,我从UIManagedDocument得到了一个nil返回值,同时也收到了相同的错误消息。删除存储不是我的选择,因为我正在支持一个发布的应用程序。 - Danny Sung
只是另一个数据点...我创建了一个示例项目,通过UIManagedDocument初始化Core Data,方式与我在我的应用程序中所做的完全相同,但是示例项目似乎可以成功迁移(即使没有任何persistentStoreOptions)。 - Danny Sung

0

你的问题有一个非常简单的解决方案。只需从模拟器或设备中删除应用(触摸应用程序图标几秒钟,当应用程序图标开始晃动时触摸交叉符号)。这样,Xcode 将更新您的应用程序 UIManagedDocument。


1
如果应用程序已经在商店中,那怎么办?您可以显示一个弹出窗口,要求用户重新安装您的应用程序。 - MrBr
我认为pH-k的回答是问题提问者需要的,因为他正在跟随教程,而不是为了将应用程序发布到商店 :) - Philip007
这对我没有帮助。它说持久存储不可用,但我明显有它! - coolcool1994

0

请确保您没有将NSDocumentDirectory误写为NSDocumentationDirectory。

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

NSDocumentDirectory 是正确的!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接