如何在 MagicalRecord saveWith Block 之外创建核心数据实体

Posted

技术标签:

【中文标题】如何在 MagicalRecord saveWith Block 之外创建核心数据实体【英文标题】:Howto create core data entities outside of MagicalRecord's saveWithBlock 【发布时间】:2014-09-11 08:06:45 【问题描述】:

这是My previous question的后续内容

本质是我需要在一个类中创建一个核心数据对象并将其传递给另一个类然后保存它。由于我们尝试使用坚持创建不同上下文的 MagicalRecord,情况变得复杂。这是一个显示问题的精简代码块(这是在单元测试中):

__block HLMReferenceData *referenceData = [HLMReferenceData MR_createEntity];
__block NSManagedObjectID *objId = nil;
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext)
    HLMReferenceData *localReferenceData = [referenceData MR_inContext:localContext];
    [localContext obtainPermanentIDsForObjects:@[localReferenceData] error:NULL];
    objId = localReferenceData.objectID;

                  completion:^(BOOL success, NSError *saveError)
                      referenceData = (HLMReferenceData *)[[NSManagedObjectContext defaultContext] existingObjectWithID:objId error:NULL];
                  ];

本质上,我们是在创建对象,将其传递给 MR 保存调用,然后重新检索该对象以便我们可以继续使用它。

这在执行... MR_inContext:localContext]; 方法时会引发核心数据133000 错误。它似乎源于主上下文没有保存记录并且它仍然有一个临时ID的事实。

确实需要一些帮助,因为我们需要能够在 MR 的 saveWithBlock: 代码之外创建对象。

【问题讨论】:

您找到解决方案了吗?我也有同样的问题... 我们发现了一个我们不喜欢但有效的“黑客”。我们基本上重新编码以避免使用多个上下文的 MR。在其他地方,我们手动管理 MR 之外的对象。简而言之,MR 并不是它声称的灵丹妙药。 【参考方案1】:

假设:您使用的是 MagiaclRecord 2.3beta5。如果没有,请发布您的版本。

您实际上是在 MagicalRecord 的 -saveWithBlock: 之外创建对象。你的第一行就是这样做的。它在 MR_defaultContext 中创建一个对象,但该对象没有持久化。它只存在于 MR_defaultContext 中。如果你想持久化该对象,那么你可以简单地做:

 [referenceData.managedObjectContext MR_saveToPersistentStoreAndWait]; // or a variant of

您可以将referenceData 传递给另一个对象、viewController 等,即使它没有保存。

【讨论】:

以上是关于如何在 MagicalRecord saveWith Block 之外创建核心数据实体的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 - MagicalRecord:如何在空实体上使用 findFirst

如何更改 MagicalRecord 中实体的主键?

如何确保在使用 MagicalRecord 3.0 保存后台线程后通知 NSFetchedResultsController

如何在 MagicalRecord saveWith Block 之外创建核心数据实体

如何在 Swift 中使用 MagicalRecord CoreData 删除 tableview 中的记录

MagicalRecord:如何将值导入相关实体