我正在将核心数据与UIManagedDocument用于库存保持应用。我遇到的问题是,当我在向核心数据添加项目后使用UIDocumentSaveForOverwriting保存时,“saveToURL:...”方法实际上正在删除Documents目录中的UIManagedDocument文件。这仅在首次从新构建启动时发生。我创建了一个核心数据/ UIManagedDocument帮助程序单例,以便在整个应用程序中使用。
以下是我初始化UIManagedDocument实例的方法:
@interface VDFCoreDataHelper : NSObject
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) UIManagedDocument *managedDocument;
@implementation VDFCoreDataHelper
- (void)createManagedDocument
{
NSURL *docsURL = [self getDocsURL];
if (![[NSFileManager defaultManager] fileExistsAtPath:[docsURL path]]) {
NSLog(@"new doc made");
_managedDocument = [[UIManagedDocument alloc] initWithFileURL:docsURL];
[self saveManagedDocumentForCreation];
[self openManagedDocument];
} else {
NSLog(@"existing doc");
_managedDocument = [[UIManagedDocument alloc] initWithFileURL:docsURL];
[self openManagedDocument];
}
}
在init方法中调用CreateManagedDocument。 我有两种保存方法。一个用于创建,一个用于覆盖。我创建托管文档时会调用第一个。
此时,我只保存了一次,我的文档文件夹中存在UIManagedDocument目录和持久存储文件。
当我想插入一个Item对象(一个Item实体存在)时,我调用这个方法:
- (void)insertManagedObject:(NSManagedObject *)object success:(void (^)(BOOL successful))successBlock
{
NSManagedObjectContext *context = [self context];
[context insertObject:object];
NSError *error;
[context save:&error];
if (self.managedDocument.documentState == UIDocumentStateNormal) {
[self.managedDocument saveToURL:[self getDocsURL] forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success){
successBlock(success);
}];
}
}
在调用“saveToURL:forSaveOperation:”之后,我的托管文档目录和Documents文件夹中的文件都被自动删除。此时,managedObjectContext,Item对象和managedDocument对象都是有效的。文档的URL指向正确的目标,但所有文件都已消失。
在我的“insertManagedObject”方法完成后,我使用导航控制器弹回rootViewController,其中包含列出项目的表视图。我添加的数据保存在内存中,fetchedResultsController加载它,但数据没有保存到磁盘,因为不再有持久存储。退出应用程序并重新输入时,不显示任何内容,并再次创建新的托管文档。
只有在我清除构建并首次启动它时才会发生这种情况。如果我启动并立即退出,然后再次进入应用程序,一切正常。这是“saveToURL:...:方法删除我的持久存储。
我已经尝试了子类化UIManagedDocument并记录错误,但它没有显示任何错误。我试过评论一些代码,但它们没有什么区别。
如果我不使用“saveToURL”,持久性存储不会被删除,但是在重新启动时,fetchResultsController.fetchObjects返回一个空数组并尝试访问不存在的indexPath,从而导致应用程序崩溃。
我正在考虑现在放弃UIManagedDocument。希望有人可以告诉我我可能做错了什么,或者遇到了同样的问题。
感谢。
答案 0 :(得分:1)
我正在和你一样苦苦挣扎。但是没有找到任何帮助...
删除部分没有任何错误让我疯了,我几乎抛弃了UIManagedDocument。
但我做了一些确实有效的事情!。
实际上我认为问题是在创建文档后尝试访问文档,调用选择器:
[_document saveToURL:self.documentURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {}];
然后我所做的就是在保存文档后关闭它,获取一个新实例然后重新打开它。像这样:
[_coreDocument saveToURL:self.documentURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
if (success) {
NSLog(@"Document created");
[_coreDocument closeWithCompletionHandler:^(BOOL success) {
if (success) {
NSLog(@"Closed recently created document, will open it again");
_coreDocument = nil;
_coreDocument = [[CheckinManagedDocument alloc] initWithFileURL:self.documentURL];
[_coreDocument openWithCompletionHandler:^(BOOL success) {
NSLog(@"Document oppened afer creating and closing it");
[self documentIsReadyForUse];
}];
}
}];
} else {
NSLog(@"Could not save the document at path: %@", self.documentURL.path);
}
}];