2011-08-18 18 views
9

Występuje awaria podczas zmiany atrybutu BOOL obiektu NSManagedObject.Błąd danych podstawowych NSInvalidArgumentException

Kod zapisać obiekt jest:

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

i błąd:

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.' 
+0

Musisz dodać więcej kodu - jak wygląda twoja szczegółowością; czy to tylko NSManagedObject? – deanWombourne

+0

Tak, 'detailItem' jest po prostu NSManagedObject z atrybutem BOOL o nazwie' bookmark'. –

Odpowiedz

7

UWAGA: Ta odpowiedź jest oparta na przypuszczeniu zrobiłem na podstawie komunikatu o błędzie; może być w 100% błędne!


Błąd wygląda na nieprawidłowo uformowany NSPredicate. Może masz coś podobnego

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

który wygląda jak może znaleźć coś gdzie name = 'Bob' ale to nie będzie, to będzie wyjątek :(

Jeśli używasz „IN” trzeba zdać .. NSSet lub NSArray tj

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

ten znajdzie coś o nazwie 'Bob' lub 'Alice'

Jeśli po prostu chciał sprawdzić 'Bob', po prostu to zrobić:

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

W tym polu VC nie ma predykatu. Jednak mam oddzielny VC, który ma ten predykat '[NSPredicate predicateWithFormat: @" DOWOLNA zakładka == YES "];' Czy coś tam jest nie tak? –

+1

Ten błąd oznacza, że ​​inny obiekt, który interesuje się zmianami w zarządzanym obiekcie, powoduje ten wyjątek, więc może to być predykat.Wypróbuj bez "KAŻDEGO" i zobacz, co się stanie? – deanWombourne

+0

Próbowałem, ale nadal mam awarię. Dla VC, z którym pracujemy, to cały kod, który mam związany z obiektem, obiekt jest wypychany z widoku rodzica. Nie mam żadnego kodu MOC, ponieważ obiekt powinien pociągnąć sam MOC. –

3

Sądzę, że DeanWornbourne napisał poprawną odpowiedź, ale nie było to dla mnie zbyt jasne, więc zamierzam powtórzyć jego odpowiedź i spostrzeżenia oraz przedstawić dodatkowe wyjaśnienie.

ProgramGuy otrzymywał poważny błąd aplikacji, ponieważ jego predykat był błędny. Powodem, dla którego ANY bookmark == YES jest nieprawidłowy jest to, że "DOWOLNY" jest używany tylko wtedy, gdy masz relację jeden-do-wielu w swoim modelu. Gdy masz relację jeden-do-jednego, powinieneś użyć bookmark == YES.

"Poważny błąd aplikacji" jest nieco głupio brzmiący i powoduje więcej alarmów niż to konieczne. Daje jednak całkiem niezłą wskazówkę co do błędu. Mówi, że istnieje "błąd w obserwatorze ...". Oznacza to, że masz jakiś obiekt "NSFetchedResults" lub "NSFetchedResultsController" (ponieważ mówimy o NSManagedObjectContextObjectChangedNotification). Ponadto komunikat o błędzie mówi: left hand side for an ALL or ANY operator must be either an NSArray ... To sugeruje, że musi istnieć relacja jeden-do-wielu.

Mam nadzieję, że to pomaga.

0

Tylko dla FYI. Odpowiedź deana Wombourne'a była w moim przypadku w 100% prawidłowa.

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

Po usunięciu dowolnej problem został rozwiązany. Dzięki Bogu za dziekana! Właśnie uratował mnie od wielu godzin rozwiązywania problemów i bólów głowy.

Powiązane problemy