UIManagedDocument无法保存。

7
我正在使用UIManagedDocument来管理我的数据。我创建了模型并使用它,一切似乎都正常,但我的更改没有被写回SQLite存储。
UIManagedDocument的文档说自动保存应该负责将数据持久化到数据库中,但似乎并没有发生这种情况。
    NSManagedObjectContext *moc = [doc managedObjectContext];
    NSError *error = nil;
    MyItem *itemToAdd = (MyItems *)[moc existingObjectWithID:(NSManagedObjectID *)itemsID error:&error];

这将获取我想要添加的对象(并成功获取)。

   [itemContainer addItemsObject:itemToAdd];
   [doc updateChangeCount:UIDocumentChangeDone];

这将把该项目添加到另一个对象中的项目集合中,然后告诉文档我完成了更改。

我希望在此之后不久就能看到更改写入Core Data存储,但是观察Instruments时,我发现它从未发生。

项目集合是NSOrderedSet类型,并且由于此项的评论:

在NSOrderedSet生成的访问器中抛出异常

我已经向持有该集合的对象添加了addItemsObject:方法:

- (void)addItemsObject:(MyItem *)value 
{
    NSMutableOrderedSet* tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.items];
    [tempSet addObject:value];
    self.items = tempSet;
}

也许 Core Data 没有正确获知到项目集合已经发生了变化,但我不知道具体出了什么问题。

通过Instruments,我可以看到数据被写入了Core Data缓存中。但它并没有显示在Core Data保存工具中,如果我杀死并重新启动应用程序,我的更改会消失。 - stevex
3
我找到了问题。原来我在尝试添加的对象中有一个错误,我漏掉了一个必需的属性,如果不覆盖handleError,就没有任何迹象表明出了问题。在这里写了一篇博客文章:http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/ - stevex
3个回答

10

1
这是一个很棒的发现 - CoreData在许多情况下允许对象在内存中持久化,但不保存到磁盘,有时会非常具有误导性,你提供的解决方法非常好。 - NSTJ
我提供了一个答案,以便在将来链接失效的情况下总结您的链接 :) - olynoise

1

@stevex的链接中的主要内容/总结:

确保调用UIManagedDocument的-updateChangeCount方法或触发已在文档的undoManager中注册的更改。否则,文档不认为需要保存任何内容。

此外,子类化一些关键方法将允许您查看自动保存何时发生以及是否存在错误。

- (id)contentsForType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError {

    id retVal = [super contentsForType:typeName error:outError];
    NSLog(@"Autosaving document. contentsForType at fileURL %@ error %@", self.fileURL, *outError);
    return retVal;
}


- (void)handleError:(NSError *)error userInteractionPermitted:(BOOL)userInteractionPermitted {
    [super handleError:error userInteractionPermitted:userInteractionPermitted];
    NSLog(@"ManagedDocument handleError: %@  %@", error.localizedDescription, error.userInfo);
}

1
在我从服务器获取数据的方法中,我首先创建实体,然后调用这两个方法立即保存更改到文档中:
[self.document updateChangeCount:UIDocumentChangeDone];
[self.document savePresentedItemChangesWithCompletionHandler:^(NSError *errorOrNil) {
            ...
        }];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接