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
risposta
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!
È 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.
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:
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;
}
- 1. iphone Aggiornamento del database Numero
- 2. AppStore: modifica dell'icona dopo la pubblicazione dell'app?
- 3. Modifica numero di versione del database SQLite
- 4. applicazione per iPhone Aggiornamento Vs nuova versione
- 5. iPhone versione dell'applicazione di aggiornamento (in Impostazioni)
- 6. Aggiornamento del database su __destruct()?
- 7. Aggiornamento SQL Azure dimensione del database
- 8. AppStore in iPhone Simulator Xcode
- 9. Aggiornamento del database con più SQL Statments
- 10. Modifica del nome di un database SQL
- 11. SQL Server: modifica del database corrente tramite la variabile
- 12. Passi per caricare un'applicazione iPhone in AppStore
- 13. Aggiornamento database sqlite quando il database del server viene aggiornato
- 14. Modifica del database hybris su MySQL
- 15. Applicazione iPhone con o senza AppStore
- 16. Aggiornamento del numero di versione del progetto su git push
- 17. Modifica DBML, come modificare il database SQL?
- 18. Data e ora dell'ultimo aggiornamento del database SQL Server
- 19. Modificare il nome del venditore su Appstore
- 20. Listener di modifica del database di SQL C#
- 21. Uso del controllo di versione (Git) su un database MySQL
- 22. Modifica la modalità database SQLite in lettura/scrittura
- 23. aggiornamento database sql con ContentValues e il metodo di aggiornamento
- 24. Crittografia del file di database SQLite su iPhone OS
- 25. Modifica del database predefinito per un accesso SQL Azure
- 26. Impostare dinamicamente il nome del database in LINQ su SQL
- 27. Aggiornamento database Android
- 28. Aggiornamento delle versioni del database SQLite?
- 29. Aggiornamento senza problemi di Azure quando lo schema del database cambia
- 30. Rimandare aggiornamento DataGridView durante la modifica del DataTable sottostante
I dati sono di sola lettura o di lettura/scrittura? –
i dati sono di sola lettura. –