我正在使用魔法记录来处理核心数据。我有创建实体的代码,如下所示:
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上下文?
所有保存和创建都在主线程上运行。
答案 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];
由于某种原因,第一个谓词并不总是准确的。而第二个似乎总是有效。
虽然这确实回答了这个问题,但我很好奇为什么人们会相信为什么第一个谓词并不总是有效...