【问题标题】:Core Data Managed Object unable to save context (Error 134030)核心数据托管对象无法保存上下文(错误 134030)
【发布时间】:2016-01-30 06:48:43
【问题描述】:

当尝试在持久存储协调器中保存具有以下配置的托管对象时:

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

我收到以下错误:

未解决的错误 Error Domain=NSCocoaErrorDomain Code=134030 “保存时出错。” UserInfo={NSFilePath=/var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite, NSAffectedStoresErrorKey=( “(网址:file:///var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel.sqlite)” ), NSUnderlyingError=0x127335c50 {Error Domain=NSCocoaErrorDomain Code=4 "该文件不存在。" UserInfo={NSUnderlyingError=0x12732a670 {错误域=NSPOSIXErrorDomain Code=2“没有这样的文件或目录” UserInfo={NSFilePath=/var/mobile/Containers/Data/Application/9FCED2FF-F976-4780-8192-208519C8CD11/Documents/ParallelPhotosModel .sqlite}}}}},{ NSAffectedStoresErrorKey = ( “(网址: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 \"该文件\U2019t 不存在。\" 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}}}"; }

这里的根本问题是什么,我该如何避免?我在某处看到尝试保存在 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);

【问题讨论】:

  • 你能把代码显示在applicationDocumentsDirectory
  • @Paul.s 这是获取文档目录的内置方法
  • 该选择器没有内置方法
  • 该代码 sn-p 没有保存更改。是导致问题的代码,还是代码中保存更改的其他地方的问题?
  • 调用 - (void)saveContext 时输出错误。但正如您从错误中看到的那样,正如我所期望的那样,商店位置由我在上面包含的 sn-p 配置

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


【解决方案1】:

在将 URL 添加到持久存储之前,您可能需要确保目录存在。

[[NSFileManager defaultManager] createDirectoryAtURL:[storeURL URLByDeletingLastPathComponent]
                         withIntermediateDirectories:YES
                                          attributes:nil
                                               error:NULL];

实际上,您可能希望在返回值之前将此代码添加到您的applicationDocumentsDirectory 方法中。如果这样做,请确保正确处理潜在错误。

编辑

在行上放一个断点

NSManagedObjectContext *context = [appDelegate managedObjectContext];

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

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

然后,在文件和/或文件系统上安装一个观察器,以便在它发生更改时收到通知,并查看您是否可以捕获正在删除或移动的文件。

【讨论】:

  • 不,它没有工作.. 目录按时创建并返回 YES,因此没有抛出错误
  • 您可能应该单步调试调试器,并准确地发现它何时崩溃并发布该信息,因为到目前为止您发布的内容,除了文件/目录不存在之外没有什么.
【解决方案2】:

所以,我在实现中更改了几件事,但我认为为我解决的问题是以下行:

[newAddress.managedObjectContext 保存:无]

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

这是一个 managedObjectContext 似乎是错误的。 可能它是一些重复的。因此,我认为始终使用您刚刚对其进行更改的 Object 拥有的 managedObjectContext 是一个很好的策略,以确保安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    相关资源
    最近更新 更多