Core Data Managed Object 无法保存上下文(错误 134030)
Core Data Managed Object unable to save context (Error 134030)
尝试在持久存储协调器中保存具有以下配置的托管对象时:
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ParallelPhotosModel.sqlite"];
NSError *error = nil;
NSString *failureReason = @"There was an error creating or loading the application's saved data.";
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
我收到以下错误:
Unresolved error Error Domain=NSCocoaErrorDomain Code=134030 "An error occurred while saving." UserInfo={NSFilePath=/var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite, NSAffectedStoresErrorKey=(
" (URL: file:///var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite)"
), NSUnderlyingError=0x127335c50 {Error Domain=NSCocoaErrorDomain Code=4 "The file doesn’t exist." UserInfo={NSUnderlyingError=0x12732a670 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory" UserInfo={NSFilePath=/var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite}}}}}, {
NSAffectedStoresErrorKey = (
" (URL: file:///var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite)"
);
NSFilePath = "/var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite";
NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=4 \"The file doesn\U2019t exist.\" UserInfo={NSUnderlyingError=0x12732a670 {Error Domain=NSPOSIXErrorDomain Code=2 \"No such file or directory\" UserInfo={NSFilePath=/var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite}}}";
}
这里的根本问题是什么,我该如何避免?我在某处看到当尝试在应用程序包中保存时会弹出类似的错误,但我使用的 storeURL 取自教程(即文档目录)。
更新:
更具体地说,我粘贴了 NSManagedObjectContext 应该允许我保存但不允许保存的位置:
NSManagedObjectContext *context = [appDelegate managedObjectContext];
for (DBMetadata *file in metadataContents) {
NSString *photo_info = [file photo_info];
if (photo_info != nil) {
NSNumber *day_taken = [self extractDayFromString: photo_info];
NSNumber *month_taken = [self extractMonthFromString: photo_info];
NSNumber *year_taken = [self extractYearFromString: photo_info];
NSString *db_path = [file path];
NSManagedObject *parallelPhoto = [NSEntityDescription
insertNewObjectForEntityForName:@"ParallelPhotos"
inManagedObjectContext:context];
[parallelPhoto setValue:db_path forKey:@"pathInDropbox"];
[parallelPhoto setValue:day_taken forKey:@"day"];
[parallelPhoto setValue:month_taken forKey:@"month"];
[parallelPhoto setValue:year_taken forKey:@"year"];
NSLog(@"ADDED TO DB: %@ %@ %@", day_taken, month_taken, year_taken);
}
}
NSError *error = nil;
if(![context save:&error]){
NSLog(@"error: %@", error);
在将 URL 添加到持久存储之前,您可能需要确保该目录存在。
[[NSFileManager defaultManager] createDirectoryAtURL:[storeURL URLByDeletingLastPathComponent]
withIntermediateDirectories:YES
attributes:nil
error:NULL];
实际上,您可能希望在返回值之前将这段代码添加到您的 applicationDocumentsDirectory
方法中。如果这样做,请确保正确处理潜在的错误。
编辑
在行上打个断点
NSManagedObjectContext *context = [appDelegate managedObjectContext];
然后逐步完成。检查 MOC 和 PSC 的属性。您还应该检查持久存储所持有的 URL。然后您应该检查文件系统以查看该目录中的内容。
如果 none 有效,请在最初创建 MOC/PSC 的位置放置一个断点,并确保它已正确创建。检查文件系统以确保存储存在。
然后,在文件 and/or 文件系统上安装一个观察器,以便在文件发生更改时得到通知,并查看是否可以捕获正在删除或移动的文件。
因此,我在我的实现中更改了一些内容,但我认为对我来说修复它的是以下行:
[newAddress.managedObjectContext save:nil]
而不是
[上下文保存:&错误]
这是一个似乎是错误的 managedObjectContext。
可能是重复的。因此,我得出结论,为了安全起见,始终使用您刚刚对其进行更改的对象所拥有的 managedObjectContext 是一个很好的策略。
尝试在持久存储协调器中保存具有以下配置的托管对象时:
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ParallelPhotosModel.sqlite"];
NSError *error = nil;
NSString *failureReason = @"There was an error creating or loading the application's saved data.";
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
我收到以下错误:
Unresolved error Error Domain=NSCocoaErrorDomain Code=134030 "An error occurred while saving." UserInfo={NSFilePath=/var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite, NSAffectedStoresErrorKey=( " (URL: file:///var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite)" ), NSUnderlyingError=0x127335c50 {Error Domain=NSCocoaErrorDomain Code=4 "The file doesn’t exist." UserInfo={NSUnderlyingError=0x12732a670 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory" UserInfo={NSFilePath=/var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite}}}}}, { NSAffectedStoresErrorKey = ( " (URL: file:///var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite)" ); NSFilePath = "/var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite"; NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=4 \"The file doesn\U2019t exist.\" UserInfo={NSUnderlyingError=0x12732a670 {Error Domain=NSPOSIXErrorDomain Code=2 \"No such file or directory\" UserInfo={NSFilePath=/var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite}}}"; }
这里的根本问题是什么,我该如何避免?我在某处看到当尝试在应用程序包中保存时会弹出类似的错误,但我使用的 storeURL 取自教程(即文档目录)。
更新:
更具体地说,我粘贴了 NSManagedObjectContext 应该允许我保存但不允许保存的位置:
NSManagedObjectContext *context = [appDelegate managedObjectContext];
for (DBMetadata *file in metadataContents) {
NSString *photo_info = [file photo_info];
if (photo_info != nil) {
NSNumber *day_taken = [self extractDayFromString: photo_info];
NSNumber *month_taken = [self extractMonthFromString: photo_info];
NSNumber *year_taken = [self extractYearFromString: photo_info];
NSString *db_path = [file path];
NSManagedObject *parallelPhoto = [NSEntityDescription
insertNewObjectForEntityForName:@"ParallelPhotos"
inManagedObjectContext:context];
[parallelPhoto setValue:db_path forKey:@"pathInDropbox"];
[parallelPhoto setValue:day_taken forKey:@"day"];
[parallelPhoto setValue:month_taken forKey:@"month"];
[parallelPhoto setValue:year_taken forKey:@"year"];
NSLog(@"ADDED TO DB: %@ %@ %@", day_taken, month_taken, year_taken);
}
}
NSError *error = nil;
if(![context save:&error]){
NSLog(@"error: %@", error);
在将 URL 添加到持久存储之前,您可能需要确保该目录存在。
[[NSFileManager defaultManager] createDirectoryAtURL:[storeURL URLByDeletingLastPathComponent]
withIntermediateDirectories:YES
attributes:nil
error:NULL];
实际上,您可能希望在返回值之前将这段代码添加到您的 applicationDocumentsDirectory
方法中。如果这样做,请确保正确处理潜在的错误。
编辑
在行上打个断点
NSManagedObjectContext *context = [appDelegate managedObjectContext];
然后逐步完成。检查 MOC 和 PSC 的属性。您还应该检查持久存储所持有的 URL。然后您应该检查文件系统以查看该目录中的内容。
如果 none 有效,请在最初创建 MOC/PSC 的位置放置一个断点,并确保它已正确创建。检查文件系统以确保存储存在。
然后,在文件 and/or 文件系统上安装一个观察器,以便在文件发生更改时得到通知,并查看是否可以捕获正在删除或移动的文件。
因此,我在我的实现中更改了一些内容,但我认为对我来说修复它的是以下行:
[newAddress.managedObjectContext save:nil]
而不是 [上下文保存:&错误]
这是一个似乎是错误的 managedObjectContext。 可能是重复的。因此,我得出结论,为了安全起见,始终使用您刚刚对其进行更改的对象所拥有的 managedObjectContext 是一个很好的策略。