2010-10-14 11 views
18

pojawia się następujący komunikat o błędzie podczas próby dodania rekordu:Poważny błąd aplikacji w podstawowe dane z fetchedResultsContainer

Poważny błąd aplikacji. Wyjątek został przechwycony podczas przetwarzania danych podstawowych . Zazwyczaj jest to błąd w obrębie obserwatora NSManagedObjectContextObjectsDidChangeNotification. Indeks 0 jest nieważny z userinfo (null)

I to wszystko. Umieściłem breakpointy we wszystkich metodach delegowanych pobierającychResultsContainer, które zaimplementowałem, ale nic nie zepsuje.

I śledzone w dół do:

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"titleFirstLetter" cacheName:@"Root"]; 

"sectionNameKeyPath" jest problemem. "titleFirstLetter" jest przejściową własnością, dla której stworzyłem getter dla mojej podklasy NSManagedObject.

Oto Getter:

-(NSString *)titleFirstLetter 
{ 
    [self willAccessValueForKey:@"titleFirstLetter"]; 
    NSString *aString = [[self valueForKey:@"title"] uppercaseString]; 

    NSString *stringToReturn = [aString substringWithRange:[aString rangeOfComposedCharacterSequenceAtIndex:0]]; 

    [self didAccessValueForKey:@"titleFirstLetter"]; 
    return stringToReturn; 
} 

Kiedy zmienić sectionNameKeyPath do zera, to działa, ale oczywiście nie jest to, co chcę. Działa to również, gdy mam już wypełniony tytuł dla mojego modelu, tak że titleFirstLetter nie zwraca wartości zerowej, chociaż nie wydaje się to być problemem. Jeśli zrobię ciąg znaków coś arbitralnego, jeśli jest zerowy, to nadal się zawiesza.

Każdy pomysł, co jest tutaj?

AKTUALIZACJA: Jeśli użyję tytułu w sekcji NazwaKluczKey zamiast właściwości przejściowej, to nie ulega awarii, ale oczywiście umieszcza każdy element we własnej sekcji. Więc jest w jakiś sposób związany z przejściową własnością ...

UPDATE2: Niektóre wstępne hakowanie przy użyciu trwałej właściwości zamiast przejściowej i żadnych innych zmian wydaje się działać dobrze, więc wygląda na to, że jest to błąd. Mam zgłoszenie błędu otwarte: # 8553064

UPDATE3: Cóż, zadrap się. Użycie trwałego atrybutu nie miało znaczenia. Trochę kończę na białym końcu.

Dzięki!

Odpowiedz

12

To prawdopodobnie częściowo (lub całkowicie) błąd użytkownika. Problem polegał na tym, że w widoku, w którym dodałem nowy element, umieściłem [self.tableView reloadData] w metodzie . Komentowanie tego nie zaktualizowało komórek tabeli, ale zapobiegło awarii.

Następnie wysłałem reloadRowsAtIndexPaths:withRowAnimation: do widoku tabeli, aby ręcznie odświeżyć kilka komórek, które go potrzebowały.

Cieszę się, że to już koniec!

+0

Uratowałem mój bekon! Dzięki! Gdzie dodałeś reloadRowsAtIndexPaths: withRowAnimation :? –

+0

bardzo dziękuję. ten problem przeszkadza mi przez długi czas. – derjohng

2

Domyślnym zachowaniem kontrolera pobranych wyników jest utworzenie jednej sekcji dla każdej pierwszej litery z sectionNameKeyPath. Nie powinieneś dostawać jednej sekcji za przedmiot, chyba że każdy element zaczyna się od innej litery.

Jeśli chcesz dostosować zachowanie nazwy sekcji, podklasy NSFetchedResultsController i zastąpić sectionIndexTitleForSectionName: i sectionIndexTitles. Zobacz dokumentację NSFetchedResultsController, aby uzyskać szczegółowe informacje.

+0

Co ja tu robię źle? http://assets.zerodeviation.net/sections.png To jest z tytułem jako sectionNameKeyPath. – Christoph

+0

Aby dodać do tego, dokumenty mówią, że __IndexTitle__ jest domyślnie wielką literą. I to prawda. Ale mówię o tytułach sekcji. – Christoph

+0

Indeksy tytułowe są tytułami sekcji. Zobacz, jak nazywa się lista aplikacji kontaktów. Używa tej dokładnie wbudowanej metody. Nie wiem, dlaczego dostałeś ten problem. Najprawdopodobniej masz gdzieś przekreślone atrybuty. – TechZen

1

Odkryłem inny sposób dotarcia do tego samego tajemniczego wyjątku. Moja przejściowa właściwość - taka jak Twoja, aby wyodrębnić pierwszą literę - nie była chroniona przed ciągiem o długości 0 (@ ""). Próba uzyskania swojej pierwszej postaci rzuciła wyjątek i spowodowała błąd w danych podstawowych (a nie wyjątek, którego można się spodziewać).

2

Pomyślałem, że to mój problem. Miałem ten sam komunikat ostrzegawczy, ale moje rozwiązanie było BARDZO różne.

Możesz uzyskać ten błąd, jeśli nie poprawnie wdrożyłeś wszystkich metod delegowania NSFetchedResultsController. Zawsze po prostu kopiuję i wklejam 4 metody z Apple, jak zaimplementować NSFetchedResultsController.

Niestety przeoczył jeden z nich:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView beginUpdates]; 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView endUpdates]; 
} 

UPEWNIAŁ masz EM, inaczej będziesz wyciągać włosy jak ja.

+0

Będę miał na to oko, dzięki! – Christoph

+0

Jest to bardzo proste rozwiązanie typowego problemu. Podczas gdy wszystkie inne odpowiedzi, które mam pewność, są również słuszne, ten subtelny błąd może również generować ten sam błąd. Warto zauważyć. –

0

Ważne

NSFetchedResultsController * consultMessageFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[[[WYCoreDataStorage shareStore] coreDataHelper] mainContext] sectionNameKeyPath:nil cacheName:nil]; 

Jeśli używasz pamięci podręcznej, należy zadzwonić deleteCacheWithName: przed zmianą któregokolwiek z jego żądanie FETCH orzecznika lub jego sortowania opisów. Nie możesz ponownie użyć tego samego kontrolera wyników dla wielu zapytań, chyba że ustawisz wartość cacheName na zero.

Powiązane problemy