Po dodaniu nowej wersji modelu Core Data do mojej aplikacji wykonałem niewielką migrację, najwyraźniej z powodzeniem. Zmigrowany plik jest ładowany poprawnie, ale przy pierwszej próbie uzyskania dostępu do atrybutu za pośrednictwem określonej relacji aplikacja ulega awarii z wartością NSRangeException: '*** -[__NSArrayM objectAtIndex:]: index 4294967295 beyond bounds [0 .. 35]'
. Ta relacja działała dobrze przed migracją. Wiem z innych postów, że 4294967295 jest naprawdę -1
, ale jedyną rzeczą, którą mogę zidentyfikować w 36 elementach w mojej aplikacji/danych jest to, że w modelu danych jest 36 całych obiektów (dla odniesienia, pobrana relacja ma 58 pozycji w jego tabeli).NSRangeException po migracji danych podstawowych
Pytanie:
Moje pytanie brzmi: na podstawie błędu dostaję i rozwiązywania problemów robiłem poniżej, istnieje rodzaj zmiany schematu, który mógłby przejść lekką migracji, ale uszkodzony dane po drodze, prowadzące do wspomnianego wyjątku? Spróbuję podzielić migrację na mniejsze fragmenty w kilku wersjach, aby wyizolować lub ominąć problem, ale byłoby miło móc skupić się na konkretnych zmianach schematu, które mogą być wadliwe.
Niepowodzenie:
Niepowodzenie występuje z następującego kodu w "MyObject":
[[self object2] text];
Relacja object2 jest jeden, non-opcjonalne oba sposoby i ani do przodu, ani odwrotna zależność została zmieniona między modelami danych. Atrybut text
prawdopodobnie nie ma znaczenia, ponieważ gdy wystąpi błąd, w obiekcie2 nie zostanie osiągnięty awakeFromFetch
. Jeśli przypiszę [self object2]
do zmiennej przed powyższą instrukcją, przypisanie zakończy się powodzeniem i zgłasza data: <fault>
.
Baza:
Patrząc na bazie danych w sqlite3, zauważam następujące:
- wartości indeksu dla przednich i odwrotnych relacji wydaje się być prawidłowa w każdej tabeli.
- Tabela object2 ma dwie kolumny dla relacji odwrotnej zamiast poprzedniej, a dodatkową
Z2_MYOBJECT
, która jest pusta dla wszystkich wierszy. Żadna inna relacja nie została dodana w celu wyjaśnienia tej kolumny. - W tabeli wszystkie wpisy po migracji pokazują
-1
dla , podczas gdy przed migracją pokazywały zero dla pustych tabel i maksymalny numer wiersza dla wypełnionych tabel. Ręczne aktualizowanie do odpowiednich wartościZ_MAX
nie pomogło w przypadku wyjątku. Wszystkie wartościZ_SUPER
były poprawne.
Ustawiłem model odwzorowania, aby sprawdzić, czy coś nie wyglądało dobrze z automatycznym odwzorowaniem, ale wszystko wyglądało dobrze.
Ogólny schemat zmienia:
W wersji źródłowej modelu danych, było czternaście podmiotów, z których tylko cztery zostały wypełnione danymi (aplikacja jest wciąż w rozwoju). Siedem było jednostkami najwyższego poziomu, a siedem było podelementami trzech jednostek najwyższego poziomu.
W docelowej wersji modelu danych dodano dwadzieścia dwa podmioty, niektóre najwyższego poziomu i niektóre podjednostki, z dziesiątkami relacji, w tym niektóre dodane do istniejących podmiotów.
Niektóre atrybuty i relacje zostały usunięte z istniejących obiektów, a inne zostały dodane. Żadne typy danych ani ustawienia relacji nie zostały zmienione, nie zmieniono atrybutów ani relacji i nie były wymagane żadne specjalne odwzorowania.
Aktualizacja (2/25/12): Kiedy zacząłem pracować nad nowym modelem pośrednim, przypomniałem sobie, że zmieniłem klasę (representClassName) dla wielu jednostek z NSManagedObject na podklasę NSManagedObject, ale nie wygenerował pliki klas. Nie podejrzewałem, że może to spowodować problem i rzeczywiście tworzenie wszystkich plików klas nie pomogło w przypadku wyjątku. Chciałem tylko zauważyć, że to kolejna zmiana między modelami.
Wnioski:
Jest to dzikie przypuszczenie, ale jeśli liczba 36 Jednostka nie jest przypadkiem, wydaje się, że gdy „MyObject” próbuje się przyczepić w „object2” nie posiada ważnego odniesienia dla tabeli i próbuje załadować tabelę o wartości -1, powodując wyjątek. Fakt, że proste zadanie [self object2]
zakończyło się powodzeniem, nie jest jednak zgodny z tym wnioskiem.
Wszelkie pomysły?
w jaki sposób został wybrany model mapowania? po wyłączeniu automatycznej migracji? –
@ JoãoNunes Po wyłączeniu automatycznej migracji powinien automatycznie wybrać model odwzorowania, o ile pasują do niego wartości źródłowe i docelowe. Powinny się one zgadzać, o ile nie zmodyfikowałeś modelu danych od czasu utworzenia modelu odwzorowania. Niestety, czasami nie, jak to tutaj zaznaczono: (http://stackoverflow.com/questions/10894383/core-data-mapping-model-version-hashes-not-matching-to-source-model-version-hash). Włączenie trybu debugowania podstawowych danych może pomóc w rozwiązywaniu problemów z brakiem wyboru modeli odwzorowania. –
Dzięki za cynk. Dodałem debugowanie dla migracji, ale nadal mam problem. Stworzyłem tutaj pytanie: http://stackoverflow.com/questions/17464414/core-data-mapping-model-not-working- with-correct-hashes –