我收到此错误: 这项行动无法完成。 (可可错误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}
然后错误被抛出,它说“我的错误代码在这里”。我该怎么做才能解决这个问题?为什么会这样?顺便说一句,控制台吐出了迁移的所有步骤,所以看起来它正在尝试这样做,但它找不到持久性存储,我不明白它为什么找不到它,因为它已经被添加到构建目标中。
我只是想确保如果人们从以前版本的应用程序升级,他们的数据将被迁移,他们不必重新输入所有内容。谢谢!
答案 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”代码给了我所需的确切信息。 谢谢,“详细错误。”