我有一个基于NsperSistentDocument的应用程序,该应用程序将autosavesInPlace
设置为返回YES
,返回NO
,而问题消失了。
- 我创建一个新文档
- 进行一些更改
- 保存它,因此运行
NSSaveAsOperation
,文档的名称和URL的变化,一切似乎都很好,但是下一个保存将抛出一个非常描述的
NSPersistentStoreSaveError = 134030, // unclassified save error - something we depend on returned an error
这仅在文档试图在NSSaveAsOperation
之后运行保存时才发生。任何其他保存类型都可以像对现有文档的更改一样正常工作。有趣的效果是,如果我不更改名称或位置,我也不会遇到此问题。
我得到了
的异常回溯帧#0:0x00007FFF988143C5 libobjc.a.dylib
objc_exception_throw frame #1: 0x00007fff94c5f5f9 CoreData
- [nspersistentstore(_nsinternalmethods)_preflightCrosscheck] 697 帧#2:0x00007FFF94C3198B COREDATA-[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 603 frame #3: 0x00007fff94c5aa98 CoreData
- [NSMANAGEDOBJECTCONTEXT SAVE:] 456 帧#4:0x00007fff91baa101 AppKit-[NSPersistentDocument writeToURL:ofType:forSaveOperation:originalContentsURL:error:] + 3743 frame #5: 0x0000000100002de7 ZZZZ
- [zzzzdocument writeTourl:oftype:forsaveoperation:oiltercontentsurl:errory:rorror:] 135在zzzzdocument.m:209 帧#6:0x00007fff91baabc7 AppKit-[NSPersistentDocument writeSafelyToURL:ofType:forSaveOperation:error:] + 611 frame #7: 0x0000000100002ea3 ZZZZ
- [zzzzdocument writesafelyTourl:oftype:forsaveoperation:erry:error:] 115在zzzzdocument.m:223
有什么想法?
不可能使用未包装的核心数据文件
如果您尝试捕获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
Framework的捆绑/文件夹中包装文件。
等待 NSManagedDocument
(这是一个希望很好的API)