我正在尝试在一个项目中使用Core Data,其代码改编自iOS编程:The Big Nerd Ranch Guide(第3版)。打开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
,它似乎是正确的网址。重置iOS模拟器,使用SQL文件的不同名称,或者我发现的其他似乎与切线相关的问题的解决方案似乎没有任何帮助。
答案 0 :(得分: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堆栈。