'找不到指定的持久存储。' CoreData中的错误

时间:2012-06-10 01:07:05

标签: core-data migration datamodel

我收到此错误: 这项行动无法完成。 (可可错误134140.) * 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'找不到指定的持久存储。'

我刚刚更改为我的数据模型的新版本。但是,如果我激活以前版本的数据模型,那么应用程序工作正常。如果我激活新版本,我会收到该错误。我做的唯一改变是我在我的数据模型中使所有变量都是非可选的,应该可以通过自动迁移功能来处理。当[fileManager copyItemAtPath:defaultStorePath toPath:myPathDocs error:& error]没有抛出错误时,我不明白为什么它说它找不到持久存储。

我似乎认为这与我的主包中的sqlite文件来自数据模型的旧版本这一事实有关,但是没有来自新版本的sqlite文件。但是,我的印象是自动迁移只会为新模型生成一个新文件(?),并将现有文件中的数据迁移到其中。这是错的吗?

在我的iOS应用程序中,我的资源中有一个名为Formats.sqlite的文件。在干净安装后启动时,应用程序会查看应用程序的/ Documents文件夹中是否存在现有的Formats.sqlite。如果没有,则将其主要包中的那个复制到那里。在我制作新版本的模型之前,这一切都正常。这是我用于此的代码:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    int count = [[persistentStoreCoordinator persistentStores] count];
    if (persistentStoreCoordinator != nil && count) {
        return persistentStoreCoordinator;
    }
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *myPathDocs =  [documentsDirectory stringByAppendingPathComponent:@"Formats.sqlite"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error = nil;
    if (![fileManager fileExistsAtPath:myPathDocs]) {
        NSLog(@"SQLite file not found, copying SQLITE file");
        NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Formats" ofType:@"sqlite"];
        if (defaultStorePath) {
            if(![fileManager copyItemAtPath:defaultStorePath toPath:myPathDocs error:&error]) {
                NSLog(@"Error copying file at defaultStorePath to the documents path: %@",error);
            }
        }
    }
    storeURL = [NSURL fileURLWithPath:myPathDocs];
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
                             nil];
    if (persistentStoreCoordinator == nil) {
        persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    }
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    {//my error code here}

然后错误被抛出,它说“我的错误代码在这里”。我该怎么做才能解决这个问题?为什么会这样?顺便说一句,控制台吐出了迁移的所有步骤,所以看起来它正在尝试这样做,但它找不到持久性存储,我不明白它为什么找不到它,因为它已经被添加到构建目标中。

我只是想确保如果人们从以前版本的应用程序升级,他们的数据将被迁移,他们不必重新输入所有内容。谢谢!

1 个答案:

答案 0 :(得分:0)

为了找到错误的来源,我使用此代码从调试器中获取错误的最详细描述:

    NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
    if(detailedErrors != nil && [detailedErrors count] > 0) {
        for(NSError* detailedError in detailedErrors) {
            NSLog(@"  DetailedError: %@", [detailedError userInfo]);
        }
    } else {
        NSLog(@"  %@", [error userInfo]);
    }

然后在使用该代码后,错误消息表明我的模型中的某个属性没有默认值,并且需要一个属性才能使自动迁移正常工作。我添加了该属性的默认值后,一切正常。

上面的代码片段对于调试Core Data错误非常有用,因为没有它,Core Data不一定会告诉您模型中哪个确切的属性是问题的根源。使用“detailedError”代码给了我所需的确切信息。 谢谢,“详细错误。”