MR_save似乎删除了上下文中的对象

时间:2012-09-06 04:16:50

标签: ios core-data magicalrecord

我正在使用魔法记录来处理核心数据。我有创建实体的代码,如下所示:

if ( gameEntity == nil )
{    
    gameEntity = [GameEntity MR_createEntity];
}
gameEntity.opponent = opponent;
gameEntity.me = me;
etc...

然后我按如下方式查询游戏实体:

NSPredicate* gamePredicate = [NSPredicate predicateWithFormat:@"SELF IN %@ AND gameState != %@", me.myGames, GAME_ENTITY_STATE__OTHER];
NSFetchRequest* fetchRequest = [GameEntity MR_requestAllWithPredicate:gamePredicate];
NSArray * results = [[NSManagedObjectContext MR_defaultContext] executeFetchRequest:fetchRequest error:nil];
return results;

结果的大小为1(这是有道理的)。

但是当我按如下方式保存上下文时:

[[NSManagedObjectContext MR_defaultContext] MR_save];

并在上面运行相同的fetchRequest,GameEntity突然消失,NSArray中没有结果。

当我关闭应用并再次运行它时,甚至更奇怪,它找到了GameEntity。事实上它已经得救了。为什么MR_save基本上破坏了我的NSManagedObject上下文?

所有保存和创建都在主线程上运行。

1 个答案:

答案 0 :(得分:0)

事实证明问题是我的谓词,这使得这更像是一个CoreData问题,而不是一个神奇的记录。

我改变了谓词:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF IN %@ AND gameState != %@", me.myGames, GAME_ENTITY_STATE__OTHER];

对此:

predicate = [NSPredicate predicateWithFormat:@"me == %@ AND gameState != %@", me, GAME_ENTITY_STATE__OTHER];

由于某种原因,第一个谓词并不总是准确的。而第二个似乎总是有效。

虽然这确实回答了这个问题,但我很好奇为什么人们会相信为什么第一个谓词并不总是有效...