Tengo una aplicación con la versión 1.0 en la tienda de aplicaciones que usa la base de datos sqlite para leer los datos.
Ahora quiero actualizar mi versión a 1.1 con la actualización en el archivo de la base de datos.
Al usar un certificado de desarrollador cuando instalé la aplicación en el dispositivo, no actualicé la base de datos ya que el archivo de la base de datos ya existe en la carpeta de documentos, así que tengo que eliminarla manualmente e instalarla de nuevo.
Mi pregunta es, cuando cualquier usuario actualice la aplicación, la base de datos también se actualizará de acuerdo con la versión actual.
Cualquier sugerencia es bienvenida.
Graciasactualización de la base de datos sqlite cuando la aplicación cambia en Appstore en iPhone
Respuesta
estoy seguro de que hay muchas maneras de hacer esto (y de muchas maneras mejor que la mía también), pero la forma en que puedo manejar este tipo de problemas es el siguiente:
Primero definir una constante en el primer archivo .h de la aplicación (el que va a cargar primero) para indicar la carga por primera vez y ponerlo a 0:
#define FirstTime 0
Ahora usted tiene que saber que tengo la intención de guardar el valor de esta constante en la carpeta Documentos para futuras referencias, por lo tanto, uso una instancia de datos compartidos. En el viewDidLoad
hago la siguiente prueba:
//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
}
Ahora el truco está en su nueva versión de la aplicación (por ejemplo 1.1). Cómo cambio el FirstTime
a 2:
#define FirstTime 2
Dado que el valor de la primera vez guardado en el disco es 1, esto significa que será capturado por la sentencia if anterior, por lo tanto, en su interior se puede hacer lo que quiera gustaría borrar las tablas antiguas y recrearlos de nuevo con la nueva formación.
Nuevamente no es brillante, ¡pero resuelve el caso!
Puede utilizar .plist
así:
- (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];
}
}
Y usted puede llamar a la función en el inicio de la aplicación o en el controlador de vista de su controlador principal vista .. su elección.
Espero que ayude.
Este enfoque se basa en NSUserDefaults
. La idea es obtener el número de versión de la aplicación anterior (si existe) del NSUserDefaults
y compararlo con la versión actual.
El código realiza actualización de db si la versión de la aplicación anterior <
que la versión actual o si la versión anterior es nil
. Significa que este enfoque se puede usar aunque la aplicación ya se haya publicado en la AppStore. Actualizará la base de datos a la nueva versión durante la actualización de la aplicación.
Este es un archivo plist:
Hay una gran variedad que se compone del número de versión y un conjunto de consultas SQL para la versión de actualización correspondiente. Supongamos que una versión anterior es 1.2 y la versión actual es 1.4, el código realiza la actualización solo desde la versión 1.2 a la 1.4. Si la versión anterior es 1.3 y la actual 1.4 el código realiza la actualización solo de 1.3 a 1.4. Si la versión anterior es nula, el código realiza la actualización a 1.1, luego a 1.2, luego a 1.3 y finalmente 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. Actualización de la base de datos sqlite cuando la base de datos del servidor se actualiza
- 2. ¿Cómo actualizar la actualización de la aplicación SQLite DB en el iPhone?
- 3. ROR cambia la base de datos de la aplicación de SQLite a PostgreSQL
- 4. Actualización de iPhone de accesibilidad en la red cambia
- 5. Implementando sqlite DB en la actualización de la aplicación de iPhone
- 6. Pasos para cargar una aplicación de iPhone en la AppStore
- 7. iPhone Actualización de la base de datos Problema
- 8. Actualización de la aplicación de prueba en el iPhone
- 9. ¿Cómo probar una actualización de la aplicación de iPhone?
- 10. ¿Cómo mantener los datos en una base de datos SQLite en un iPhone en una actualización de la versión de la aplicación?
- 11. Mejores prácticas para la migración de la base de datos en la aplicación para Sqlite
- 12. Creando base de datos Sqlite Embedded desde la aplicación
- 13. iPhone: ¿Eliminar/eliminar la base de datos SQLite?
- 14. ¿Ciclo de vida de la base de datos Sqlite? ¿Se borra cuando la aplicación está cerrada?
- 15. ¿Dónde debo almacenar la base de datos SQLite para mi aplicación de iPhone?
- 16. Copia de datos en la carpeta de datos de la aplicación en el iPhone
- 17. Seguridad de la base de datos Sqlite
- 18. ¿Puedo encriptar la base de datos SQLite?
- 19. ¿Dónde ubicaría su archivo de base de datos SQLite en una aplicación de iPhone?
- 20. imagen de disco de la base de datos sqlite malformada en el SDK de iPhone
- 21. cómo reducir la base de datos sqlite?
- 22. ciclo de vida del almacenamiento local del iPhone: ¿sobrevive una actualización de la aplicación?
- 23. Android explore la base de datos SQLite en el teléfono
- 24. iPhone versión de la aplicación de actualización (en Configuración)
- 25. ¿Tamaño máximo de la base de datos SQLite en la memoria de una aplicación de Android?
- 26. Crear tablas en la base de datos sqlite en android
- 27. En Android, compruebe si la base de datos sqlite existe falla de vez en cuando
- 28. ¿Qué sucede con una base de datos Sqlite cuando se elimina la aplicación?
- 29. Guardando ArrayList en la base de datos SQLite en Android
- 30. Insertar matriz en la base de datos SQLite en android
¿Los datos son solo de lectura o de lectura/escritura? –
los datos son de solo lectura. –