2010-07-30 10 views
5

Opracowuję system kopii zapasowych/przywracania dla mojej aplikacji, w którym użytkownik może pobrać kopię zapasową podstawowej składnicy danych (plik sqlite) i zastąpić aktualnie używany magazyn danych z pobranym plikiem. Jednak gdy użytkownik pobierze plik i zastąpi bieżącą składnicę danych, żadne dane nie wydają się być aktualizowane. Ale gdy aplikacja zostanie ponownie uruchomiona, przywrócone dane są dostępne. Jak zmusić moją aplikację do ponownego załadowania pliku głównego magazynu danych?Zastępowanie pliku sqlite Core Data podczas pracy aplikacji, dane nie są aktualizowane

Próbowałem uzyskać dostęp do aplikacji delegata z moim UIViewController, który odtwarza dane, jak tak, aby odbudować stosu danych rdzenia i propogate go we wszystkich kontrolerów widoku w stosie nawigacja:

MyAppDelegate *app = [[UIApplication sharedApplication] delegate]; 
app.managedObjectContext = nil; 
app.persistentStoreCoordinator = nil; 
app.managedObjectModel = nil; 
managedObjectContext = [app managedObjectContext]; 

NSArray *controllers = [self.navigationController viewControllers]; 
UIViewController *c; 
for (int i = 0; i < [controllers count]; i++) { 
    c = [controllers objectAtIndex:i]; 
    [c setManagedObjectContext:managedObjectContext]; 
} 

Ale to nie działa, generuje tylko następujący błąd po powrocie do kontrolera widoku root: 'The NSManagedObject with ID:0x5d79060 <x-coredata://D8E73D64-C9BA-4CFA-9213-F8BD61749155/MyObject/p2> has been invalidated.'

Czy ktoś wie, jak zmusić aplikację do ponownego załadowania danych i rozpoczęcia pracy z nowym plikiem składnicy danych?

Odpowiedz

1

Co moim zdaniem jest potknięcia was jest fakt, że choć można ustawić wszystkich zarządzanych konteksty obiektów, sklep koordynatorów oraz podobne do nil, trzeba jeszcze całkowicie odtworzyć każdy zarządzany obiekt w użyciu, że był oparty na tych obiektach.

Najlepszym wyjściem jest zrobienie tego, co teraz robisz, ale także znalezienie sposobu na zniszczenie wszystkich obiektów Core Data, z których korzystałeś. Może możesz pop swoje różne kontrolery widoku do katalogu głównego i ponownie załadować ten kontroler od podstaw, aby używał twojego nowego stosu danych podstawowych? Stracisz pewną łatwość obsługi (ponieważ będą musieli odbudować stos kontrolerów widoku przy użyciu nowych danych, które załadowałeś), ale będziesz pewny, że zniszczyłeś wszystko, czego potrzebujesz.

+0

Dzięki za odpowiedź. Działa to świetnie. Czy wiesz, jak radzić sobie z wersjami w tej sytuacji? Próbowałem zastąpić plik sqlite starszą wersją i daje mi błąd "Can not find model for source store". –

+0

Musisz jawnie zmienić swój model pliku. Xcode ma na to narzędzia - poszukaj opcji dodania wersji modelu do istniejącego 'xcdatamodel'. – Tim

Powiązane problemy