2013-05-02 12 views
5

Nella mia app, ho usato il DB sqlite. Ho inviato la versione 1.0 dell'app all'app store. Ma dopo ho fatto alcune modifiche in DB come inserire alcune nuove righe.Copia database aggiornato nel dispositivo in ios sdk

Quindi inviato 1.1 versione dell'app. But i will not able to get updated DB because the old DB already exists in device.

Come posso risolvere questo?

Se si elimina l'applicazione &, quindi installare la nuova versione di app, quindi ho ottenuto il DB aggiornato.

//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]); 
    } 
} 

Ho chiamato questo metodo in modo appDidFinishLaunching.

Come posso ottenere aggiornato DB senza eliminare l'applicazione quando la nuova versione è disponibile

risposta

5

Per questo è possibile utilizzare NSUserDefaults.

Nella nuova versione aggiungere questo codice:

- (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 
} 

Metodo per la rimozione del vecchio file di database:

- (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

Grazie mille! Wow, che grande idea di farlo molto facilmente. – AtWork

0

Sarà necessario eseguire una migrazione di database in modo che i vecchi utenti della tua app non perdono i loro dati.

Ciò significa controllare quale versione del database esiste già ed eseguire le istruzioni SQL necessarie per aggiornare lo schema ei dati.

Il MTMigration quadro (licenza MIT) può aiutare a eseguire il codice una volta per ogni versione della vostra applicazione, ad esempio:

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

ma si potrebbe desiderare di rilevare la versione del database in modo diverso.

Sarebbe una buona idea scrivere alcuni test unitari per questa procedura. Incastrare i dati degli utenti è l'ultima cosa che vuoi fare.

+0

Grazie per la risposta! Quindi, dovrei scrivere tutte le domande a livello di codice? – AtWork

+0

È possibile inserire l'SQL direttamente nel codice sorgente o conservarlo nei file .sql per una gestione più semplice che viene quindi caricata in fase di esecuzione. –

+0

Quindi, secondo te, se voglio inserire alcune nuove righe nel DB, devo eseguire programmaticamente nuove query invece di aggiungere direttamente nel DB sql. – AtWork

0

Devi scrivere dati script di migrazione: -

Nel caso in cui è necessario apportare modifiche a una tabella esistente che contiene alcuni dati, quindi è necessario eseguire alcuni passaggi come segue:

1) Rinominare la tabella esistente

Say TableName era 'TabellaProva', così Rinominare la tabella a 'TestTableOld'

2) Creare una nuova tabella denominata 'TabellaProva' che ha le nuove colonne che si desidera e altri alterchi fatti.

3) copiare i dati da 'TestTableOld' a 'TestTable' con la query come:

Inserire nel TestTable ('col1', col2' ... 'coln') I valori col1 Select, col2, col3, ...'coln' Da TestTableOld;

E il valore impostato per la colonna appena aggiunto è vuoto, poiché le nuove voci verranno utilizzate come tali.

4) Eliminare la tabella 'TestTableOld'

Seguire la procedura di cui sopra quattro passaggio come questo dovrebbe funzionare come una dichiarazione alter ed inoltre sarebbe conservare tutti i dati dalla vostra tabella originale.

Se si utilizza User_Version, sarebbe utile identificare il vecchio DB con nuovo DB

Problemi correlati