Базовые данные NSInvalidArgumentException Ошибка - PullRequest
9 голосов
/ 19 августа 2011

Я получаю сбой при изменении атрибута BOOL моего NSManagedObject.

Код для сохранения объекта:

self.detailItem.bookmark = [NSNumber numberWithBool:YES];
NSError *error = nil;
if (!    [self.detailItem.managedObjectContext save:&error]) 
{
    // Handle the error.
}
NSLog(@"%@", error);

И ошибка:

Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet. with userInfo (null)
2011-08-18 15:41:32.866 Codes[5260:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet.'

Ответы [ 3 ]

7 голосов
/ 19 августа 2011

ВНИМАНИЕ: Этот ответ основан на предположении, которое я сделал на основании сообщения об ошибке;это может быть на 100% неправильно!


Ошибка выглядит как неправильно сформированная NSPredicate.У вас может быть что-то вроде

NSString *name = @"Bob";
[NSPredicate predictaeWithFormat:@"ANY %K IN %@", @"name", name];

Похоже, что он может найти что-нибудь, где name = 'Bob', но этого не произойдет, возникнет исключение: (

Если вы используетеIN 'вам нужно передать NSSet или NSArray, т. Е.

NSArray *names = [NSArray arrayWithObjects:@"Alice", @"Bob", nil];
[NSPredicate predictaeWithFormat:@"ANY %K IN %@", @"name", names];

Это найдет что-нибудь с именем' Bob 'или' Alice '.

Если вы просто хотели найти'Боб, просто сделай это:

NSString *name = @"Bob";
[NSPredicate predictaeWithFormat:@"%K == %@", @"name", name];
3 голосов
/ 05 февраля 2013

Я думаю, что Дин Уорнборн написал правильный ответ, но он мне не очень понятен, поэтому я собираюсь переформулировать его ответ и выводы и дать дополнительное объяснение.

ProgramGuy получил серьезную ошибку приложения, потому что его предикат был неверным.Причина, по которой ANY bookmark == YES является неправильной, заключается в том, что «ЛЮБОЙ» используется только в том случае, если в вашей модели есть отношение «один ко многим».Если у вас отношения один-к-одному, вы должны использовать bookmark == YES.

«Серьезная ошибка приложения» звучит немного глупо и вызывает больше тревоги, чем необходимо.Тем не менее, это дает вам довольно хороший ключ к ошибке.Там говорится, что в наблюдателе есть «ошибка».Это означает, что у вас есть какой-то объект NSFetchedResults или настройка NSFetchedResultsController (поскольку мы говорим о NSManagedObjectContextObjectChangedNotification).Кроме того, сообщение об ошибке гласит left hand side for an ALL or ANY operator must be either an NSArray ... Это намекает на то, что должно быть отношение один ко многим.

Надеюсь, это поможет.

0 голосов
/ 03 июня 2013

Просто к вашему сведению.Ответ Дина Вомбурна был на 100% правильным в моем случае.

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyTeamSchedule" inManagedObjectContext:[[MyTeamStore sharedStore] context]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY myteam.teamname == %@", myTeamName];

После удаления ЛЮБОГО проблема была решена.Слава богу за декана!Просто избавил меня от многих часов устранения неполадок и головной боли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...