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];
По некоторым причинам первый предикат не всегда точен. В то время как второй, кажется, всегда работает.
Хотя это и отвечает на вопрос, мне было бы любопытно, почему люди верят, почему первый предикат не всегда работает...