使用 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 不起作用