2009-10-12 21 views
25

Mam aplikację na iPhone'a, która używa danych podstawowych.Migracja danych podstawowych w wielu wersjach aktualizacji

Zrobiłem aktualizację i użyłem Lightweight Migration, aby przejść od V1 do V2 mojej MOM (Managed Object Model). To działało idealnie.

Co się stanie, gdy chcę przejść do V3 (i dalej) mojej MOMI?

  • Jeśli zdecyduję się na kontynuację Lightweight Migration, czy automatycznie zajmie się migracją z V1 do V3 i V2 do V3 mojej MOM, czy też muszę zrobić coś ekstra?
  • Jeśli zdecyduję się użyć modelu odwzorowania, co się stanie? Jak mam sobie poradzić z uaktualnieniem MOM V1 i V2 do wersji V3? Czy muszę utworzyć model odwzorowania dla V1 na V3 i V2 na V3?
  • To pytanie idzie dalej ... co się dzieje, gdy mam V6 MOM i nadal muszę wspierać możliwość aktualizacji z V1 MOM?

Kolejnym pytaniem jest, jaki jest najlepszy sposób określenia wersji bieżącej aplikacji MOM? Należy użyć opcji KonfiguracjaConfiguration: compatibleWithStoreMetadata:

Dziękujemy za pomoc. Kocham Core Data. Czasami jednak kręci mi się w głowie i wpadam w zakłopotanie, dlatego szukam mądrości mądrości.

Odpowiedz

2

Poszedłem ze zwykłą migracją przy użyciu metody createDestinationInstancesForSourceInstance.
Krótki opis pokazuje, jak zastąpić tę metodę i jak uzyskać wersję źródłową modelu do migracji. Rzeczywista migracja odbywa się w klasie pomocnika TZMigrationHelper.

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error 
{ 
    float sourceVersion = [[[mapping userInfo] valueForKey:@"sourceVersion"] floatValue]; 
    if(sourceVersion <= 0.9) 
    { 
     mapping = [TZMigrationHelper addAttributeMappingForDerivedRTFProperties:sInstance mapping:mapping propertyName:@"someProperty"]; 
     mapping = [TZMigrationHelper addAttributeMappingForDerivedRTFProperties:sInstance mapping:mapping propertyName:@"anotherProperty"]; 
     mapping = [TZMigrationHelper addAttributeMappingForDerivedRTFProperties:sInstance mapping:mapping propertyName:@"oneMoreProperty"];  
    } 
    return [super createDestinationInstancesForSourceInstance:sInstance entityMapping:mapping manager:manager error:error]; 
} 
+1

Po przyjrzeniu się bliżej dokumentowi Apple CoreDataVersioning.pdf stwierdza on, że proces migracji "Próbuje znaleźć model odwzorowania, który odwzorowuje model modelu zarządzanego dla istniejącego magazynu na model używany przez koordynator magazynu trwałego. " Oznacza to, że muszę utworzyć coraz większą liczbę modeli mapowania dla każdego rev mojej bazy danych. Tak więc, w przypadku V3, potrzebowałbym modelu odwzorowania V1 do V3, a także modelu odwzorowania V2 do V3. Tak więc jestem zdezorientowany przez twoją logikę "upadku" i dlaczego jest ona potrzebna. – thevoid

+0

Czy próbowałeś, czy wystarczy zdefiniować wiele modeli do migracji w wielu wersjach? Myślę, że usunę powyższe podejście, ponieważ nie jestem również pewien, czy jest potrzebny. –

7

Początkowy wpis był już wiele miesięcy temu, ale myślę, że najlepszą odpowiedź można znaleźć w książce danych Core Marcus Zarra (lub on-line w przykładach kodu). Google dla "progressivelyMigrateURL" i znajdzie kod do progresywnego iterowania przez modele - co pozwoliłoby na tworzenie odwzorowań od modelu n do modelu n + 1, nie martwiąc się o kombinatoryczną eksplozję tworzenia mapowań między wszystkimi parami modeli.

Może to spowolnić migrację w czasie wykonywania. Nie zbadałem tego.

+1

Jest zdecydowanie wolniejszy w czasie wykonywania niż możliwość przeskakiwania bezpośrednio z wersji v1 do wersji v15. Jednak testowanie wydajności pomoże ustalić, czy moja progresywna migracja będzie działać, czy też będziesz musiał wykonać wszystkie mapy. –

+0

Kod źródłowy z metodą progressivelyMigrateURL pochodzi z książki Pragmatic Bookshelf "Core Data". Link jest tutaj: http://pragprog.com/titles/mzcd/source_code – bentford

+0

Kod Macrusa Zarry jest świetny i bardzo polecam jego książkę o Core Data. To powiedziawszy, musiałem wprowadzić następującą zmianę w celu uniemożliwienia jej powtarzania w nieskończoność, jeśli odkryje pliki '.mom' w niewłaściwej kolejności: [gist.github.com/2321704](http://gist.github.com/2321704) (bez tego, istnieje szansa, że ​​będzie kontynuował próbę migracji do tej samej wersji, na której jest już uruchomiony, FOREVER.) –

Powiązane problemy