更新数据时 MagicalRecord saveWithBlockAndWait 不起作用

Posted

技术标签:

【中文标题】更新数据时 MagicalRecord saveWithBlockAndWait 不起作用【英文标题】:MagicalRecord saveWithBlockAndWait doesn't work when updating data 【发布时间】:2014-09-18 20:58:23 【问题描述】:

我使用 MagicalRecord v2.3.0 beta 3。我看到 MR_contextForCurrentThread 已被弃用,建议使用 saveWithBlockAndWait。所以我写了我的代码来更新这样的一个项目:

[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) 
   Item *item = [Item MR_createEntityInContext:localContext];
   item.text = newText;
];

但这不起作用。但是,saveWithBlockAndWait 可以很好地用于插入和删除。

然后我必须使用 MR_contextForCurrentThread 来进行更新。

NSManagedObjectContext *localContext    = [NSManagedObjectContext MR_contextForCurrentThread];
Item *item = [Item MR_findFirstByAttribute:@"id" withValue:itemId];
item.text = newText;     
[localContext MR_saveToPersistentStoreAndWait];

有什么问题?

【问题讨论】:

您保存/更新了多少对象?多频繁?您是否发现在主线程上运行更新时出现任何问题(保持简单并在您有实际理由时进行重构)。 我在单元测试中测试只更新一个对象,但并不频繁,因为我手动测试它。我还没有在我的主线程中测试它。 您编写第一个示例的方式应该可行。当你说它不起作用时,你期望发生什么,实际发生了什么? 第一种方式,调用saveWithBlockAndWait后,item的文本不会改变。这就是我问它的原因。 【参考方案1】:

您写道,您想要更新,但您的代码将在当前上下文中创建一个新实体。

也许正确的代码是:

[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) 
   Item *item = [Item MR_findFirstByAttribute:@"id" withValue:itemId inContext:localContext];
   item.text = newText;
];

此代码应更新 itemID 指定的实体。

祝你好运!

【讨论】:

以上是关于更新数据时 MagicalRecord saveWithBlockAndWait 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

MagicalRecord 调用多个保存方法

MagicalRecord UIApplicationDidEnterBackground

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

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

合奏:MagicalRecord 和 iCloud

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