2013-05-02 10 views
5

W mojej aplikacji użyłem DB sqlite. Przesłałem wersję 1.0 aplikacji do sklepu z aplikacjami. Ale potem zrobiłem kilka zmian w DB, takich jak Wstawianie nowych wierszy.Skopiuj Zaktualizowaną bazę danych do urządzenia w ios sdk

Następnie przesłano wersję 1.1 aplikacji. But i will not able to get updated DB because the old DB already exists in device.

Jak mogę to rozwiązać?

Po usunięciu aplikacji & zainstaluj nową wersję aplikacji, a następnie zaktualizuję bazę danych.

//My code for copy of DB is as follow: 

- (void)createEditableCopyOfDatabaseIfNeeded 
{ 
    // First, test for existence. 
    BOOL success; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"xxx.sqlite"]; 
    success = [fileManager fileExistsAtPath:writableDBPath]; 
    if (success) return; 

    // The writable database does not exist, so copy the default to the appropriate location. 

    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"xxx.sqlite"]; 
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
    if (!success) { 
     NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
    } 
} 

nazwałem tę metodę w sposób appDidFinishLaunching.

Jak mogę uzyskać zaktualizowane DB bez usuwania aplikacji, gdy nowa wersja jest dostępna

Odpowiedz

5

Możesz użyć do tego celu NSUserDefaults.

W nowej wersji dodać ten kod:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    if(![[NSUserDefaults standardUserDefaults] boolForKey:@"1.1"]]) 
    { 
    [self removeDatabase]; 
    [self createEditableCopyOfDatabaseIfNeeded]; 
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"1.1"]; 
    } 
    //Other stuffs 
} 

sposobu usuwania starego pliku bazy danych:

- (void)removeDatabase 
{ 
    BOOL success; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *removeDBPath = [documentsDirectory stringByAppendingPathComponent:@"xxx.sqlite"]; 
    success = [fileManager fileExistsAtPath:writableDBPath]; 
    if(success) 
    { 
     [fileManager removeItemAtPath:writableDBPath error:&error] 
    } 
} 
+0

Wielkie dzięki! Wow, świetny pomysł, żeby to zrobić bardzo łatwo. – AtWork

0

Trzeba będzie przeprowadzić migrację bazy danych tak, że stare użytkownicy aplikacji nie tracą swoich danych.

Oznacza to sprawdzenie, która wersja bazy danych już istnieje i wykonanie niezbędnych instrukcji SQL w celu zaktualizowania schematu i danych.

MTMigration ramy (licencja MIT) może pomóc wykonanie kodu raz w wersji swojej aplikacji, na przykład:

[MTMigration migrateToVersion:@"1.1" block:^{ 
    // migrate the SQL database here 
}]; 

Ale może chcesz wykryć wersję bazy danych w inny sposób.

Byłoby dobrze napisać kilka testów jednostkowych dla tej procedury. Przykręcanie danych użytkownika to ostatnia rzecz, którą chcesz zrobić.

+0

Dziękujemy za odpowiedź! Czy zatem programowo powinienem napisać wszystkie zapytania? – AtWork

+0

Możesz umieścić SQL bezpośrednio w swoim kodzie źródłowym lub zachować go w plikach .sql dla łatwiejszego zarządzania, który następnie ładujesz w czasie wykonywania. –

+0

Tak, według ciebie, jeśli chcę wstawić kilka nowych wierszy w DB, muszę wykonać nowe kwerendy programowo zamiast dodawać bezpośrednio w sql DB. – AtWork

0

Trzeba zapisywać dane skryptu migracji: -

w przypadku, gdy musisz wprowadzić zmiany do wychodzącej tabeli zawierającej pewne dane, a następnie wykonać kilka kroków:

1) Zmiana nazwy istniejącej tabeli

Say TableName był „TestTable”, więc zmiana nazwy tabeli, aby „TestTableOld”

2) Utwórz nową tabelę o nazwie „TestTable”, który ma nowe kolumny chcesz i inne wykonane sprzeczki.

3) Kopiowanie danych z 'TestTableOld' do 'TestTable' z kwerendy jak:

Włóż do TestTable ('col1', col2' ... '') wartości Cöln Wybierz col1, col2, Col3, ..."coln" From TestTableOld;

I nowo dodana wartość zestawu kolumn jako pusta, ponieważ dla nowych wpisów będzie używana jako taka.

4) usunąć tabelę „TestTableOld”

Wykonaj powyższą procedurę cztery kroku jak to będzie działać jako ALTER i też byłoby zachować wszystkie swoje dane z oryginalnej tabeli.

Jeśli używasz User_Version, to pomocne byłoby zidentyfikowanie starego DB z nowym DB

Powiązane problemy