2012-01-09 8 views
17

Ho un'app con versione 1.0 su app store che utilizza il database sqlite per la lettura dei dati.
Ora voglio aggiornare la mia versione a 1.1 con l'aggiornamento nel file di database.
Durante l'installazione del certificato sviluppatore quando installo l'app sul dispositivo, non ha aggiornato il database poiché il file del database esiste già nella cartella documenti, quindi devo eliminare manualmente l'app e installarla di nuovo.
La mia domanda è, quando un utente aggiorna l'app, anche il database verrà aggiornato in base alla versione corrente.
Qualsiasi suggerimento è benvenuto.
Grazieaggiornamento del database SQL quando modifica la versione dell'app su Appstore in iPhone

+0

I dati sono di sola lettura o di lettura/scrittura? –

+0

i dati sono di sola lettura. –

risposta

14

Sono sicuro che ci sono molti modi per fare questo (e per molti versi meglio allora anche la mia), ma il modo in cui mi occupo di questi problemi è la seguente:

prima cosa definire una costante nel primo file .h della app (quello che verrà caricato per primo) per indicare il carico prima volta e impostarlo su 0:

#define FirstTime 0 

Ora dovete sapere che ho l'intenzione di salvare il valore di questa costante nella cartella Documenti per riferimenti futuri, quindi utilizzo un'istanza dati condivisa. Nel viewDidLoad faccio la seguente prova:

//if first time run of this version 
if([MyDataModel sharedInstance].count < (FirstTime + 1)) 
{ 
    //do what you need to do as the first time load for this version 

    [MyDataModel sharedInstance].count++ 
    //save the count value to disk so on next run you are not first time 
    //this means count = 1 
} 

Ora il trucco è sulla vostra nuova applicazione di versione (ad esempio 1.1). Cambio la FirstTime-2:

#define FirstTime 2 

Poiché il valore prima volta salvato sul disco è 1 questo significa che saranno catturati dal se dichiarazione di cui sopra, quindi, al suo interno si può fare tutto quello che vuoi come eliminare i vecchi tavoli e ricrearli di nuovo con la nuova formazione.

Ancora non brillante, ma risolve il caso!

6

È possibile utilizzare .plist così:

- (void)isItTheFirstTimeAfterUpdate { 
    NSString *versionnum; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                 NSUserDomainMask, 
                 YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yourplist.plist"]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    if(![fileManager fileExistsAtPath:path]) { 
     NSString *bundle = [[NSBundle mainBundle] pathForResource:@"yourplist" ofType:@"plist"]; 
     [fileManager copyItemAtPath:bundle toPath:path error:&error]; 
    } 

    NSMutableDictionary *savedStock = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; 
    versionnum = @""; 
    //it can be installed by user (for ex. it is 1.3 but first installed), no plist value is set before 
    if(([savedStock objectForKey:@"versionnum"]) && (![[savedStock objectForKey:@"versionnum"] isEqualToString:@""])){ 
     versionnum = [savedStock objectForKey:@"versionnum"]; 
    } 

    //to get the version of installed/updated-current app 
    NSString *myversion = [NSString stringWithFormat:@"%@",[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]; 
    //if no version has been set-first install- or my version is the latest version no need to do sth. 
    if ([versionnum isEqualToString:myversion] || [versionnum isEqualToString:@""]) { 
     NSLog(@"Nothing has to be done"); 
    } 
    else { 
     [self cleanDB];//i have clean tables and create my new db tables maybe logout the user etc. 
     [savedStock setObject:[NSString stringWithString:myversion] forKey:@"versionnum"];//setting the new version 
     [savedStock writeToFile:path atomically:YES]; 
    } 
} 

E si può chiamare la funzione di avvio applicazione o nel controller di vista il vostro principale di controller della vista .. la vostra scelta.

spero che sia d'aiuto.

12

Questo approccio si basa su NSUserDefaults. L'idea è di ottenere il numero di versione dell'app precedente (se esistente) da NSUserDefaults e confrontarlo con la versione corrente.

Il codice esegue l'aggiornamento db se la versione dell'app precedente < della versione corrente o se la versione precedente è nil. Significa che questo approccio può essere utilizzato anche se l'app è già stata pubblicata su AppStore. Aggiornare il database alla nuova versione durante l'aggiornamento dell'app.

Questo file plist:

enter image description here

V'è una serie che si compone del numero di versione e una serie di query SQL per la corrispondente versione di aggiornamento. Supponiamo che una versione precedente sia 1.2 e che la versione attuale sia 1.4 il codice esegua l'aggiornamento solo dalla versione 1.2 alla 1.4. Se la versione precedente è 1.3 e 1.4 corrente il codice esegue l'aggiornamento solo da 1.3 a 1.4. Se la versione precedente è nulla, il codice esegue l'aggiornamento a 1.1, quindi a 1.2, a 1.3 e infine a 1.4.

NSString * const VERSION_KEY = @"version"; 

-(void)upgradeDatabaseIfRequired{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *previousVersion=[defaults objectForKey:VERSION_KEY]; 
    NSString *currentVersion=[self versionNumberString]; 

    if (previousVersion==nil || [previousVersion compare: currentVersion options: NSNumericSearch] == NSOrderedAscending) { 
     // previous < current 
     //read upgrade sqls from file 
     NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"UpgradeDatabase" ofType:@"plist"]; 
     NSArray *plist = [NSArray arrayWithContentsOfFile:plistPath]; 


     if (previousVersion==nil) {//perform all upgrades 
      for (NSDictionary *dictionary in plist) { 
       NSString *version=[dictionary objectForKey:@"version"]; 
       NSLog(@"Upgrading to v. %@", version); 
       NSArray *sqlQueries=[dictionary objectForKey:@"sql"]; 
       while (![DB executeMultipleSql:sqlQueries]) { 
        NSLog(@"Failed to upgrade database to v. %@, Retrying...", version); 
       }; 
      } 
     }else{ 
      for (NSDictionary *dictionary in plist) { 
       NSString *version=[dictionary objectForKey:@"version"]; 
       if ([previousVersion compare: version options: NSNumericSearch] == NSOrderedAscending) { 
        //previous < version 
        NSLog(@"Upgrading to v. %@", version); 
        NSArray *sqlQueries=[dictionary objectForKey:@"sql"]; 
        while (![DB executeMultipleSql:sqlQueries]) { 
         NSLog(@"Failed to upgrade database to v. %@, Retrying...", version); 
        }; 
       } 

      } 
     } 

     [defaults setObject:currentVersion forKey:VERSION_KEY]; 
     [defaults synchronize]; 
    } 

} 


- (NSString *)versionNumberString { 
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; 
    NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"]; 
    return majorVersion; 
} 
Problemi correlati