【问题标题】:autosavesInPlace causes New Document save to failautosavesInPlace 导致新文档保存失败
【发布时间】:2012-12-10 06:25:22
【问题描述】:

我有一个基于 NSPersistentDocument 的应用程序,当 autosavesInPlace 设置为返回 YES 时无法保存新文档,返回 NO 并且问题消失了。

  • 我创建了一个新文档
  • 进行一些更改
  • 保存它,然后运行NSSaveAsOperation,文档的名称和 URL 发生了变化,一切看起来都很好,但下一次保存会抛出一个非常具有描述性的内容

NSPersistentStoreSaveError = 134030, // unclassified save error - something we depend on returned an error

仅当文档在NSSaveAsOperation 之后尝试运行保存时才会发生这种情况。任何其他保存类型都可以正常工作,就像对现有文档的更改一样。有趣的效果是,如果我不更改名称或位置,我也不会遇到这个问题。

我得到一个异常回溯

帧 #0: 0x00007fff988143c5 libobjc.A.dylibobjc_exception_throw frame #1: 0x00007fff94c5f5f9 CoreData-[NSPersistentStore(_NSInternalMethods) _preflightCrossCheck] + 697 帧 #2:0x00007fff94c3198b CoreData-[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 603 frame #3: 0x00007fff94c5aa98 CoreData-[NSManagedObjectContext 保存:] + 456 帧 #4: 0x00007fff91baa101 AppKit-[NSPersistentDocument writeToURL:ofType:forSaveOperation:originalContentsURL:error:] + 3743 frame #5: 0x0000000100002de7 ZZZZ-[ZZZZDocument writeToURL:ofType:forSaveOperation:originalContentsURL:error:] + 135 在 ZZZZDocument.m:209 第 6 帧:0x00007fff91baabc7 AppKit-[NSPersistentDocument writeSafelyToURL:ofType:forSaveOperation:error:] + 611 frame #7: 0x0000000100002ea3 ZZZZ-[ZZZZDocument writeSafelyToURL:ofType:forSaveOperation:error:] + 115 在 ZZZZDocument.m:223

有什么想法吗?

【问题讨论】:

    标签: objective-c core-data osx-mountain-lion nspersistentdocument


    【解决方案1】:

    未包装的核心数据文件不可能

    如果您尝试捕获NSSaveAsOperation 并在该枚举的持久存储上进行迁移,...-journal 文件的构造将无法在沙盒外部创建。

    -(void)saveToURL:(NSURL *)url ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation completionHandler:(void (^)(NSError *))completionHandler
    {
        NSLog(@" save op = %ld to %@ ",saveOperation,url);
        NSURL *targeturl = url;
    
        if(saveOperation == NSSaveAsOperation)
        {
            //migrate pstore
            NSPersistentStore *store = [self.managedObjectContext.persistentStoreCoordinator.persistentStores lastObject];
            if (store)
            {
                NSMutableDictionary *opts = [NSMutableDictionary dictionary];
                [opts setValue:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
                [opts setValue:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    
                NSError *error = NULL;
    
                NSPersistentStore *newstore =  [self.managedObjectContext.persistentStoreCoordinator migratePersistentStore:store toURL:url options:opts withType:store.type error:&error];
    
                if(newstore == nil)
                {
                    NSLog(@"migration error %@",[error localizedDescription]);
                }
    
                self.fileURL = url;
    
    
            }
    
    
        }
    
        [super saveToURL:targeturl ofType:typeName forSaveOperation:saveOperation completionHandler:completionHandler];
    }
    

    所以我们需要使用NSPersistentDocument 框架将文件包装在一个非常重要的包/文件夹中。

    在这里等待NSManagedDocument(这是一个许愿API)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 2010-11-23
      • 1970-01-01
      相关资源
      最近更新 更多