使用saveToURL自动删除UIManagedDocument文件:forSaveOperation:completionHandler:

时间:2014-05-29 22:28:26

标签: ios core-data persistent uimanageddocument

我正在将核心数据与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。希望有人可以告诉我我可能做错了什么,或者遇到了同样的问题。

感谢。

1 个答案:

答案 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);
                }

            }];