1

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

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 上下文?

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

4

1 回答 1

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];

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

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

于 2012-09-06T20:55:47.123 回答