使用 MagicalRecord 更新 CoreData 记录会创建一个额外的空记录

Posted

技术标签:

【中文标题】使用 MagicalRecord 更新 CoreData 记录会创建一个额外的空记录【英文标题】:Updating a CoreData record using MagicalRecord creates an additional empty record 【发布时间】:2014-01-22 18:06:01 【问题描述】:

我有一个 iPad 应用程序,它使用 MagicalRecord 来管理我的 CoreData 存储。当我对记录进行更新时,除了正在更新的记录之外,我还会得到一条空记录。

更新:这是相关实体的图像:

和ClientInfo:

这是空记录的图像:

这是创建更新的代码:

if(updateFlag == NO)  //  record has been pre-loaded to enable update
    ai.aApptKey = selectedClientKey;  //  new key

ai.aStartTime = selectedStartDate;
ai.aEndTime= selectedEndDate;
ai.aServiceTech = boStaff.text;
ai.aServices = soServices.text;
ai.aNotes = soNotes.text;
ai.aImage = UIImageJPEGRepresentation(oApptImage.image, 1.0);
ai.aPosX = [NSNumber numberWithFloat: x];  //  indicates column start
ai.aPosY = [NSNumber numberWithFloat: fOffsetFromShopOpens + (iNumberOfSegments*2)];  //  appointment start slot in points.y
ai.aPosW = [NSNumber numberWithFloat: 214.0];
ai.aPosH = [NSNumber numberWithFloat: (intEndTime - intStartTime)];  //  appointment height in grid units (25 per each 15 minutes)

//    [localContext MR_saveToPersistentStoreWithCompletion:nil];  //  store it...
[localContext MR_saveToPersistentStoreAndWait];  //  store it...

我正在使用 MR_saveToPersistentStoreWithCompletion,并决定更改为 MR_saveToPersistentStoreAndWait,我得到了相同的结果。我担心的是我的一位用户的设备空间不足。有什么想法吗?

【问题讨论】:

您的问题可能是您的新记录具有必需的关系,因此会在您不知情的情况下自动创建一个实体来填补该位置。 这很有趣...让我用相关实体更新问题... 【参考方案1】:

您很有可能在相同的上下文中创建了一个空对象。它显示在数据库中,因为当您调用 save 时它就在那里。查找您对 mr_createEntity 或 mr_createInContext: 的调用并查看实际创建的内容。您还可以在代码中中断该保存点并在 lldb 中运行以下命令:

po [context insertedObjects]

查看结果集。如果其中一个对象不是您所期望的,那么您可能再次在某处预先创建了一个空白对象。

【讨论】:

嗨 Saul... 不,没有调用任何一个 MR_create 方法;当我调用 MR_saveToPersistentStore... 但是,我确实发现我在几个我删除的地方创建了一个新上下文(我在 AppDelegate.h 中定义了一个 localContext。我尝试使用 [NSManagedObjectContext MR_setDefaultContext: localContext]; ,但得到一个错误说明 no known class method(我什至导入了 .h 文件).. 还有其他建议吗? 你是如何插入对象的? MagicalRecord 方式是使用其中一种方法。您是否使用不同的创建/插入方法?寻找默认的核心数据方式。底线是 MagicalRecord 无法知道您的对象是什么,也不会为您创建任何数据。重复数据意味着您在代码中的某处创建了重复的对象。 要查找的默认对象插入方法是 + (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context on NSEntityDescription。 Saul:我不会以编程方式插入对象;我使用 XCode 5。但是,我想知道 relationships 是否与它有关。在第一次构建实体时,我认为我可能需要它们,但我从未使用过它们;所以,我正在考虑删除它们,看看会发生什么。你的想法? 听起来你仍然在某处创建一个具有 nil 值的对象。 insertNewObjectForEntityForName 方法和 MR_createInContext 方法做的事情完全相同,即向存储中插入数据。总是会使用这些方法之一来创建数据。场景中的下一个合乎逻辑的步骤意味着您在某处创建 nil 值,但尚未找到在何处。您永远不必返回并删除 nil。这两个框架的任何部分都不会为您创建数据。

以上是关于使用 MagicalRecord 更新 CoreData 记录会创建一个额外的空记录的主要内容,如果未能解决你的问题,请参考以下文章

更新 NSManagedObject 不会使用 MagicalRecord 调用 NSFetchedResultsControllerDelegate

使用 MagicalRecord 插入后 CoreData 关系未更新

更新数据时 MagicalRecord saveWithBlockAndWait 不起作用

为啥我的对象更新为 MagicalRecord 持久存储执行了两次?

使用 MagicalRecord 有效保存

使用 Cocoapods v1.0.x 拉动 pod 时无法构建 MagicalRecord