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 migrate
mé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 = true
dentro de su @Database
anotació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.grade
el 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 createSql
dentro de su migrate
mé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.java
archivo. 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 createAllTables
método, habrá scripts de creación de todas las entidades. Puede obtenerlo e incluirlo dentro de su migrate
método.
4. Procesamiento de anotaciones.
Como puede adivinar, Room genera todo lo mencionado anteriormente schema
y AppDatabase_Impl
archivos 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 @Entity
y @Database
. Tome una clase con anotaciones, @Entity
por ejemplo. Estos son los pasos que tendrás que seguir
- Cree una nueva
StringBuilder
y agregue "CREAR TABLA SI NO EXISTE"
- Obtenga el nombre de la tabla desde
class.simplename
o por tableName
campo 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
@ColumnInfo
anotación. Para cada campo, debe agregar el id INTEGER NOT NULL
estilo de una columna a su StringBuilder
.
- Agregar claves primarias por
@PrimaryKey
- Agregue
ForeignKey
y Indices
si 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-alpha03
y 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.