核心数据管理对象无法保存上下文(错误134030)

时间:2015-10-29 22:41:39

标签: ios objective-c sqlite core-data nsmanagedobject

尝试在持久性存储协调器中使用以下配置保存托管对象时:

    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]) {

我收到以下错误:

  

未解决的错误错误域= NSCocoaErrorDomain代码= 134030"保存时发生错误。" 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 {错误域= NSCocoaErrorDomain代码= 4"文件不存在。" UserInfo = {NSUnderlyingError = 0x12732a670 {错误域= NSPOSIXErrorDomain代码= 2"没有这样的文件或目录" 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 ="错误域= NSCocoaErrorDomain代码= 4 \"文件不存在。\" UserInfo = {NSUnderlyingError = 0x12732a670 {错误域= NSPOSIXErrorDomain代码= 2 \"没有这样的文件或目录\"的UserInfo = {NSFilePath =的/ var /移动/容器/数据/应用/ 9FCED2FF-F976-4780-8192-208519C8CD11 /文档/ ParallelPhotosModel.sqlite}}}&#34 ;;   }

这里的根本问题是什么?如何避免它?我曾经在某处看到当尝试保存在App捆绑包中时会弹出类似的错误,但我使用的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);

2 个答案:

答案 0 :(得分:0)

在将URL添加到持久性存储之前,您可能希望确保该目录存在。

public static IEnumerable<Rule> GetRules(Group group) 
{
     if (group.SubGroups != null)
         return group.Rules.Concat(group.SubGroups.SelectMany(g => GetRules(g)));
     else
         return group.Rules;
}

实际上,您可能希望在返回值之前将此代码添加到[[NSFileManager defaultManager] createDirectoryAtURL:[storeURL URLByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:NULL]; 方法中。如果您这样做,请确保正确处理潜在错误。

修改

在线上设置断点

applicationDocumentsDirectory

并逐步完成。检查MOC和PSC的属性。您还应该检查持久性存储所拥有的URL。然后,您应该检查文件系统以查看该目录中的内容。

如果这些都不起作用,请在最初创建MOC / PSC的位置放置一个断点,并确保正确创建它。检查文件系统以确保存储在那里。

然后,在文件和/或文件系统上安装一个观察者,以便在它发生变化时立即得到通知,并查看是否可以捕获正在删除或移动的文件。

答案 1 :(得分:0)

所以,我在实现中改变了一些东西但是为我修复了什么我认为是以下几行:

[newAddress.managedObjectContext save:nil]

而不是 [上下文保存:&amp;错误]

这是一个似乎错误的managedObjectContext。 可能是一些重复。因此,我总结一下,总是使用您刚刚对其进行更改的Object拥有的managedObjectContext是一个很好的策略,只是为了安全起见。