【问题标题】:How to properly save updates with MagicalRecord?如何使用 MagicalRecord 正确保存更新?
【发布时间】:2016-11-21 01:28:53
【问题描述】:

我正在使用 MagicalRecord,但我不明白如何让它稳定且可预测地工作。

当我需要更新一些实体时,我从数据库中检索它们,根据逻辑更改它们,然后将它们发送到我的“Saver”方法中:

- (void) saveEntities:(NSArray *)entities {
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
        for (Entity_class *entityElement in entities) {
           NSPredicate *entitySearchPredicate = [...] // Composing predicate
           Entity_class *foundEntity = [Entity_class MR_findFirstWithPredicate:entitySearchPredicate];
           foundEntity = entityElement;
        }
        [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
    } completion:^(BOOL contextDidSave, NSError *error) {
        // contextDidSave always equals NO. Sometimes changes get saved, but sometimes they don't             
    }];
}

我尝试保存本地上下文 [localContext MR_saveToPersistentStoreAndWait] 而不是默认上下文,但它从未成功。

第二天晚上,我一直在为这些上下文而苦苦挣扎,只是我已经用完了 Google 的搜索查询变体。如何处理上下文并正确保存?

【问题讨论】:

  • 我刚刚尝试保存实体[entityElement.managedObjectContext MR_saveToPersistentStoreAndWait] 的上下文并且它有效。我还是不明白,为什么saveWithBlock: 保存得这么莫名其妙。如果我需要做的只是保存实体的上下文,为什么还存在这种方法?

标签: ios objective-c iphone magicalrecord


【解决方案1】:

使用 CoreData 需要了解一些重要的注意事项:

  1. 您必须使用创建实体的上下文进行保存。 这意味着,如果实体是在不同的线程上创建的,它们可能会使用不同的上下文,有时这可能会在拥有多个线程和每秒大量保存时导致错误。

  2. “saveWithBlock”方法用于异步保存,这意味着它会在准备好后保存上下文(通常是立即保存),因此如果您尝试立即检查更改并获取数据,它可能没有尚未保存。

它将帮助您详细了解不同上下文(MainQueue 和 PrivateQueue)之间核心数据的差异。

通常我会使用给定的方法:

[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]

[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreAndWait]

您还可以使用 MR_saveToPersistentStoreWithCompletion: 进行异步保存。

这样可以保存整个上下文,而无需选择特定实体。

如果你是新手,也可以查看CoreDataStack

哪个是更新和最新的核心数据包装器

【讨论】:

    猜你喜欢
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2017-05-20
    • 2017-05-05
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多