22

我开始使用 Core Data 进行 iPhone 开发。我首先创建了一个非常简单的实体(称为评估),它只有一个字符串属性(称为评估主题)。我有以下用于插入新字符串的代码:

- (void)insertNewObject {

    // Create a new instance of the entity managed by the fetched results controller.
    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[fetchedResultsController fetchRequest] entity];
    NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

    // If appropriate, configure the new managed object.
    [newManagedObject setValue:@"My Repeating String" forKey:@"evaluationTopic"];

    // Save the context.
    NSError *error;
    if (![context save:&error]) {
        // Handle the error...
    }

    [self.tableView reloadData];
}

这工作得非常好,通过按下 + 按钮,一个新的“我的重复字符串”将被添加到表视图中并保存在持久存储中。

然后我在 Xcode 中按下“设计 - > 添加模型版本”。我向现有实体添加了三个实体,并向现有的“评估”实体添加了新属性。然后,我通过按“文件 -> 新文件 -> 托管对象类”从实体中创建了新文件,并为我的四个实体创建了一个新的 .h 和 .m 文件,包括带有 Evaluation.h 和 Evaluation 的“Evaluation”实体.m。现在我通过设置“设计 -> 数据模型 -> 设置当前版本”来更改模型版本。完成所有这些后,我更改了我的 insertMethod:

- (void)insertNewObject {

    // Create a new instance of the entity managed by the fetched results controller.
    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[fetchedResultsController fetchRequest] entity];
    Evaluation *evaluation = (Evaluation *) [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

    // If appropriate, configure the new managed object.
    [evaluation setValue:@"My even new string" forKey:@"evaluationSpeechTopic"];

    // Save the context.
    NSError *error;
    if (![context save:&error]) {
        // Handle the error...
    }

    [self.tableView reloadData];
}

这虽然行不​​通!每次我想添加一行时,模拟器都会崩溃,我得到以下信息:

"NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation.'"

在更改数据模型上的任何内容后,我在知道创建新版本之前就遇到了这个错误,但为什么这仍然会出现?我是否需要进行任何映射(即使我只是添加了以前不存在的实体和属性?)。在 Apple Dev 教程中,这听起来很简单,但我一直在努力解决这个问题,在更改模型版本后从未工作过。

4

8 回答 8

50

在 App Delegate 中创建 persistentStoreCoordinator 时,是否设置了 NSMigratePersistentStoresAutomaticallyOption 和 NSInferMappingModelAutomaticallyOption 选项?

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"database.sqlite"]];

    NSError *error = nil;
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
        // Handle error
    }    

    return persistentStoreCoordinator;
}
于 2009-07-07T13:32:18.767 回答
30

如果您只是在模拟器中收到此错误,那么您已经更改了数据模型并且它没有删除您之前使用的 sqlite 文件。

所以去:~/Library/Application Support/iPhone Simulator/User/Applications/

然后查看以 HEX 命名的文件夹,直到看到您的应用程序。打开Documents目录并删除 sqlite 文件。错误应该消失。

于 2010-06-29T08:27:04.780 回答
10

如果您在模拟器/iphone 上运行它,也请卸载该应用程序。仅在我删除应用程序后才在模拟器上为我工作!

于 2010-10-01T06:45:50.663 回答
4

在模拟器和设备中删除并重新安装应用程序对我有用。

于 2012-01-05T17:10:04.123 回答
3

这是由于您的数据库更改,因为在应用程序中有其他数据库,而在库/应用程序支持/iPhone 模拟器/用户/应用程序中有其他数据库......所以从应用程序文件夹中删除数据库对我有用。

于 2013-03-13T06:23:39.690 回答
0

有同样的问题并且它曾经可以工作,直到我将代码复制到 finder 中的另一个文件夹并开始编辑该项目,开始出现错误。修复它的是我的另一个项目有一个名为 xyz.sqlite 的存储协调器,我正在处理的“新”项目具有相同的名称,必须将其更改为 xyzv2.sqlite(类似的东西)。在这里找到答案: http ://www.iphonedevsdk.com/forum/iphone-sdk-development/27268-nspersistentstorecoordinator-has-no-persistent-stores.html

于 2011-09-13T18:37:22.317 回答
0

迈克尔的回答适合我的情况。
我修改了核心数据模型并开始收到此错误。
我的解决方案是删除应用程序(按住 HOME 并交叉应用程序)并重新启动应用程序。问题解决了!

于 2012-05-13T13:13:16.590 回答
0

您也可以在模拟器中尝试“重置内容和设置...”。这对我有用。

于 2015-08-30T23:30:34.840 回答