Habitación no no tiene un buen sistema de migración, al menos no hasta 2.1.0-alpha03.
Entonces, hasta que tengamos un mejor sistema de migración, hay algunas soluciones para tener migraciones fáciles en la sala.
Como no existe un método como @Database(createNewTables = true) o MigrationSystem.createTable(User::class), que debería haber uno u otro, la única forma posible es ejecutar
CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))
dentro de tu migratemétodo.
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))")
}
}
Para obtener el script SQL anterior , tiene 4 formas
1. Escribe tú mismo
Básicamente, debe escribir el script anterior que coincidirá con el script que genera Room. De esta manera es posible, no factible. (Considere que tiene 50 campos)
2. Exportar esquema
Si incluye exportSchema = truedentro de su @Databaseanotación, Room generará un esquema de base de datos dentro de / esquemas de la carpeta de su proyecto. El uso es
@Database(entities = [User::class], version = 2, exportSchema = true)
abstract class AppDatabase : RoomDatabase {
//...
}
Asegúrese de haber incluido las siguientes líneas en build.gradeel módulo de su aplicación
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas".toString())
}
}
Cuando ejecute o compile el proyecto, obtendrá un archivo JSON 2.json, que tiene todas las consultas dentro de su base de datos de Room.
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "325bd539353db508c5248423a1c88c03",
"entities": [
{
"tableName": "User",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
Por lo tanto, puede incluir lo anterior createSqldentro de su migratemétodo.
3. Obtener consulta de AppDatabase_Impl
Si no desea exportar el esquema, aún puede obtener la consulta ejecutando o construyendo el proyecto que generará el AppDatabase_Impl.javaarchivo. y dentro del archivo especificado puede tener.
@Override
public void createAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))");
Dentro del createAllTablesmétodo, habrá scripts de creación de todas las entidades. Puede obtenerlo e incluirlo dentro de su migratemétodo.
4. Procesamiento de anotaciones.
Como puede adivinar, Room genera todo lo mencionado anteriormente schemay AppDatabase_Implarchivos dentro del tiempo de compilación y con el procesamiento de anotaciones que agrega con
kapt "androidx.room:room-compiler:$room_version"
Eso significa que también puede hacer lo mismo y crear su propia biblioteca de procesamiento de anotaciones que genera todas las consultas de creación necesarias para usted.
La idea es crear una biblioteca de procesamiento de anotaciones para las anotaciones de habitaciones de @Entityy @Database. Tome una clase con anotaciones, @Entitypor ejemplo. Estos son los pasos que tendrás que seguir
- Cree una nueva
StringBuildery agregue "CREAR TABLA SI NO EXISTE"
- Obtenga el nombre de la tabla desde
class.simplenameo por tableNamecampo de @Entity. Agrégalo a tuStringBuilder
- Luego, para cada campo de su clase, cree columnas de SQL. Tome el nombre, el tipo, la posibilidad de nulidad del campo, ya sea por el campo en sí o por
@ColumnInfoanotación. Para cada campo, debe agregar el id INTEGER NOT NULLestilo de una columna a su StringBuilder.
- Agregar claves primarias por
@PrimaryKey
- Agregue
ForeignKeyy Indicessi existe.
- Después de terminar, conviértalo en cadena y guárdelo en alguna clase nueva que desee usar. Por ejemplo, guárdelo como se muestra a continuación
public final class UserSqlUtils {
public String createTable = "CREATE TABLE IF NOT EXISTS User (id INTEGER, PRIMARY KEY(id))";
}
Entonces, puedes usarlo como
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL(UserSqlUtils().createTable)
}
}
Hice una biblioteca de este tipo para mí mismo que puede consultar e incluso usarla en su proyecto. Tenga en cuenta que la biblioteca que hice no está llena y solo cumple con mis requisitos para la creación de tablas.
RoomExtension para una mejor migración
Aplicación que usa RoomExtension
Espero que haya sido útil.
ACTUALIZAR
En el momento de escribir esta respuesta, la versión de la sala era 2.1.0-alpha03y cuando envié un correo electrónico a los desarrolladores recibí una respuesta de
Se espera tener un mejor sistema de migración en 2.2.0
Desafortunadamente, todavía nos falta un mejor sistema de migración.