0

我按照指南在我的非基于文档的应用程序中实施核心数据迁移和版本控制。我按照报告的驾驶做了,但是当我启动应用程序时告诉我不支持我打开的模型。我怎样才能解决这个问题?

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator) {
        return _persistentStoreCoordinator;
    }

    NSManagedObjectModel *mom = [self managedObjectModel];
    if (!mom) {
        NSLog(@"%@:%@ No model to generate a store from", [self class], NSStringFromSelector(_cmd));
        return nil;
    }

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSURL *applicationFilesDirectory = [self applicationFilesDirectory];
    NSURL *storeURL = [[self applicationFilesDirectory] URLByAppendingPathComponent:@"Preventivi.storedata"];

    NSError *error = nil;
    //Turn on automatic store migration
    NSMutableDictionary *optionsDictionary = [NSMutableDictionary dictionary];
    [optionsDictionary setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    NSDictionary *properties = [applicationFilesDirectory resourceValuesForKeys:@[NSURLIsDirectoryKey] error:&error];

    if (!properties) {
        BOOL ok = NO;
        if ([error code] == NSFileReadNoSuchFileError) {
            ok = [fileManager createDirectoryAtPath:[applicationFilesDirectory path] withIntermediateDirectories:YES attributes:nil error:&error];
            NSURL *defaultStoreURL = [[NSBundle mainBundle] URLForResource:@"Preventivi" withExtension:@"storedata"];
            if (defaultStoreURL) {
                [fileManager copyItemAtURL:defaultStoreURL toURL:storeURL error:NULL];
            }
        }
        if (!ok) {
            [[NSApplication sharedApplication] presentError:error];
            return nil;
        }
    } else {
        if (![properties[NSURLIsDirectoryKey] boolValue]) {
            // Customize and localize this error.
            NSString *failureDescription = [NSString stringWithFormat:@"Expected a folder to store application data, found a file (%@).", [applicationFilesDirectory path]];

            NSMutableDictionary *dict = [NSMutableDictionary dictionary];
            [dict setValue:failureDescription forKey:NSLocalizedDescriptionKey];
            error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:101 userInfo:dict];

            [[NSApplication sharedApplication] presentError:error];
            return nil;
        }
    }

    NSURL *url = [applicationFilesDirectory URLByAppendingPathComponent:@"Preventivi.storedata"];
    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
    if (![coordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:url options:nil error:&error]) {
        [[NSApplication sharedApplication] presentError:error];
        return nil;
    }
    _persistentStoreCoordinator = coordinator;

    return _persistentStoreCoordinator;
}
4

2 回答 2

0

你能告诉应用程序在哪里抛出错误吗?如果它在最后几行,您可以尝试将 storeType NSXMLStoreType 更改为 NSSQLiteStoreType 例如。

if (![coordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:url options:nil error:&error])

if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:options error:&error]) 

为此,您还必须将后缀更改为“sqlite”。

NSURL *url = [NSURL fileURLWithPath: [applicationFilesDirectory stringByAppendingPathComponent: @"Preventivi.sqlite"]]

NSURL *defaultStoreURL = [[NSBundle mainBundle] URLForResource:@"Preventivi" withExtension:@"sqlite"];

或者如果您已经有解决方案,您可以分享这个:) 但是与我的代码相比,没有真正的区别(只有一个选项更多

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

并且您在添加持久存储时不使用选项^^)

我希望这有帮助 :)

于 2012-12-14T10:23:25.897 回答
0

您似乎已将 Core Data 堆栈配置为使用自动迁移。并在不使用版本控制的情况下继续更改模型。

您必须使用版本化模型。如果您在修改之前没有创建模型版本,则自动迁移将不起作用。为了在每次修改之前使自动迁移工作,您应该创建一个新的模型版本并修改该新版本。

例如,您想向一个实体添加几个属性并添加另一个实体,您:

  1. 创建新模型版本(选择模型文件,编辑器->添加模型版本...);
  2. 选择该新版本并添加属性和实体。

而且您还应该说明是否使用配置,因为自动迁移存在配置问题。

于 2012-12-14T10:34:52.660 回答