2010-03-21 9 views
20

¿Existe una forma estándar de hacer migraciones de esquema de base de datos en Android? Por ejemplo, el usuario instala la versión más nueva de mi aplicación para Android, pero la nueva versión necesita realizar actualizaciones en el esquema de la base de datos (y borrar la base de datos del usuario y ¡comenzar de nuevo no es una opción!). Así que necesito ejecutar algunas sentencias ALTER y/o copiar tablas la primera vez que se ejecuta mi nueva versión.¿Cómo hacer migraciones de esquema de base de datos en Android?

+0

Explique con más detalle qué entiende bajo migración de esquema? Migración donde? – Pentium10

Respuesta

10

Sí SQLiteOpenHelper tiene soporte para migrar entre diferentes versiones de esquemas DB.

La actualización se realiza mediante la aplicación de

public abstract void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) 

Y de volver a una versión anterior también está apoyado:

public abstract void onDowngrade (SQLiteDatabase db, int oldVersion, int newVersion) 
7

Con un poco de pensamiento, se puede casi automatizar una gran parte de la SQLiteOpenHelper métodos. Echa un vistazo a esta entrada de blog http://www.greenmoonsoftware.com/2012/02/sqlite-schema-migration-in-android/

Actualización: Me encontré con algunos problemas si las actualizaciones de la base de datos tardan un tiempo en completarse. Echa un vistazo a esta entrada de blog para una implementación que funciona para mí. http://www.greenmoonsoftware.com/2012/05/android-developer-how-to-safely-update-the-application-database/

0

Sé que este es un antiguo pero he desarrollado un plugin de eclipse de código abierto que es un lenguaje específico de dominio (DSL escrito con XText) que le permite especificar una base de datos como una lista de migraciones.

Genera su ContentProvider, SqliteOpenHelper y Contract para usted, en una API que se asemeja a una API como la API de contactos o Media API.

he escrito una guía básica que le ayuda a empezar aquí http://robotoworks.com/mechanoid-plugin/mechanoid-db/

Hasta el momento se apoya crear tabla, cree vista y ALTER TABLE, espero que para aplicar plenamente la sintaxis SQLite en su caso para esta DSL.

Espero que ayude y disculpe por el spam! respuesta :)

0

de Yanchenko es correcto, sin embargo, es posible que desee echar un vistazo a Droid Migrate, que es un marco que escribió que hace un amplio uso de SQLiteOpenHelper para facilitar las migraciones SQLite automáticos (muy parecido a como lo hace rieles).

+0

Viniendo de un fondo de rieles, ¡esto se ve increíble! Mi única preocupación es que todavía se mantiene activamente? El último compromiso fue hace alrededor de 2 años. – aandis

1

Todas las respuestas anteriores referentes a SQLiteOpenHelper son correctas, pero todas contienen un tipo de antipatrón: creación/modificación de estructura de DB con cadenas. Hace que el desarrollo y el mantenimiento sean más caros. A veces, una migración consiste en muchas declaraciones, algunas de ellas pueden ser bastante grandes. Escribirlos como Strings, sin ninguna sintaxis resaltando ... bueno, para estructuras pequeñas podría funcionar, pero para algunos más grandes sería una pesadilla.

Una forma mejor de administrar los cambios de esquema sería mantener cada script de migración en un archivo externo y hacer que el método de actualización de SQLiteOpenHelper los ejecute automáticamente, en el orden correcto. Aquí hay un artículo que cubre este tema: http://www.vertabelo.com/blog/sqlite-on-android-handling-database-structure-changes. Espero que esto ayude.

5

A partir de la versión 3.0 Flyway ahora es compatible con migraciones de bases de datos en Android. Funciona con SQLite, pero también con cualquier otra base de datos que desee utilizar (memoria local en memoria o DB en el servidor para aplicaciones de dos niveles).

Las migraciones se pueden escribir tanto en SQL como en Java.

+0

Me pareció un poco complicado para Flyway encontrar las migraciones en Android. Las migraciones deben estar en la carpeta de activos, que no se crea de manera predeterminada con nuevos proyectos de Android Studio. Además, Android no admitirá Migraciones (u otros activos) en Jar-files. Solución alternativa si el proyecto Jar está en el mismo Android Studio Project, es poner algo como esto en gradle.build: sourceSets {main {assets.srcDirs = ['../library/src/main/resources/' ]}} –

+0

@JohannesBrodwall Definitivamente daríamos la bienvenida a una solicitud de extracción para mejorar esto, si tiene una mejor solución que funcione de la caja. –

+0

Creo que el único lugar donde se puede mejorar es la documentación. Funciona bien, pero me tomó un tiempo darme cuenta. No pude encontrar el documento de Android en http://flywaydb.org/documentation/ –

1

Puede mejorar predeterminado SQLiteOpenHelper con la biblioteca Android-Migrator, que le permiten aplicar las migraciones desde sql archivos en la carpeta androide assets.

Cuestiones relacionadas