MR_save, кажется, удаляет объекты в контексте

Я использую магические записи для обработки основных данных. У меня есть код, который создает сущность, которая выглядит следующим образом:

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 ответ

Решение

Таким образом, оказывается, что проблема была моим предикатом, что делает это скорее проблемой 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];

По некоторым причинам первый предикат не всегда точен. В то время как второй, кажется, всегда работает.

Хотя это и отвечает на вопрос, мне было бы любопытно, почему люди верят, почему первый предикат не всегда работает...

Другие вопросы по тегам