0

我正在尝试在一个项目中使用 Core Data,其代码改编自 iOS Programming: The Big Nerd Ranch Guide (3rd ed)。打开 SQLite 文件会导致异常,并且没有多少文档阅读或搜索引擎挖掘可以帮助我弄清楚它的含义或如何避免它。

有问题的代码位于数据存储类的 init 方法中,内容如下:

- (id)init
{
    self = [super init];
    if (self) {
        // snip
        NSURL *storeURL = [NSURL fileURLWithPath:[self itemArchivePath]];
        NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] init];
        NSError *error = nil;
        if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
            [NSException raise:@"Couldn't open the SQL file" format:@"Reason: %@", [error localizedDescription]];
        }
        // snip
    }
    return self;
}

异常发生在 addPersistentStoreWithType: 行上,所以我们不会在 if 块中出现异常。这是我被告知的内容:

2013-07-01 14:46:04.647 (app name)[5859:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: NSStoreModelVersionHashes)'

当我在错误行上设置断点时,Xcode 不允许我进入函数调用,所以我不确定 NSStoreModelVersionHashes 来自何处或如何避免将其设置为 nil。我可以po storeURL,而且它似乎是正确的 URL。重置 iOS 模拟器,为 SQL 文件使用不同的名称,或我发现的其他解决方案似乎与切线相关的问题似乎没有任何帮助。

4

1 回答 1

2

持久存储协调器需要托管对象模型。它通常是用

NSPersistentStoreCoordinator *psc =  [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];

managedObjectModel以前创建的地方

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"<yourModelName>" withExtension:@"momd"];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

查看 Apple Developer Library 中的任何 Core Data 示例代码,了解如何正确设置 Core Data 堆栈的示例。

于 2013-07-01T06:07:22.000 回答