La biblioteca de persistencias de Room brinda varios beneficios en comparación con el uso directo de las APIs de SQLite como los siguientes:
- Verificación del tiempo de compilación de las consultas en SQL
- Anotaciones de conveniencia que minimizan el código estándar repetitivo y propenso a errores
- Rutas de migración de bases de datos optimizadas
Si tu app actualmente usa una implementación de SQLite que no es Room, lee esta página para obtener información sobre cómo migrar tu app para usar Room. Si Room es la primera implementación de SQLite que usas en tu app, consulta Cómo guardar contenido en una base de datos local con Room para obtener información básica de uso.
Pasos de la migración
Sigue estos pasos para migrar tu implementación de SQLite a Room. Si tu implementación de SQLite usa una base de datos de gran tamaño o búsquedas complejas, quizás te convenga migrar a Room de manera gradual. Para consultar una estrategia de migración incremental, consulta este artículo.
Actualiza las dependencias
Para usar Room en tu app, debes incluir las dependencias apropiadas en el archivo build.gradle
de la app. Consulta Configuración para obtener las dependencias de Room más recientes.
Actualiza las clases de modelo en entidades de datos
Room usa entidades de datos para representar las tablas en la base de datos. Cada clase de entidad representa una tabla y tiene campos que representan columnas en esa tabla. Sigue estos pasos para actualizar las clases de modelo existentes para que sean entidades de Room:
- Agrega la anotación
@Entity
a la declaración de clase para indicar que se trata de una entidad de Room. De manera opcional, puedes usar la propiedadtableName
para indicar que la tabla resultante debe tener un nombre diferente al nombre de la clase. - Agrega la anotación
@PrimaryKey
al campo de clave primaria. - Si alguna de las columnas de la tabla resultante debe tener un nombre diferente al nombre del campo correspondiente, agrega la anotación
@ColumnInfo
al campo y establece la propiedadname
con el nombre de columna correcto. - Si la clase tiene campos que no deseas conservar en la base de datos, agrega la anotación
@Ignore
a esos campos para indicar que Room no debe crear columnas para ellos en la tabla correspondiente. - Si la clase tiene más de un método de constructor, indica qué constructor Room debe usar al agregar la anotación
@Ignore
al resto de los constructores.
Kotlin
@Entity(tableName = "users") data class User( @PrimaryKey @ColumnInfo(name = "userid") val mId: String, @ColumnInfo(name = "username") val mUserName: String?, @ColumnInfo(name = "last_update") val mDate: Date?, )
Java
@Entity(tableName = "users") public class User { @PrimaryKey @ColumnInfo(name = "userid") private String mId; @ColumnInfo(name = "username") private String mUserName; @ColumnInfo(name = "last_update") private Date mDate; @Ignore public User(String userName) { mId = UUID.randomUUID().toString(); mUserName = userName; mDate = new Date(System.currentTimeMillis()); } public User(String id, String userName, Date date) { this.mId = id; this.mUserName = userName; this.mDate = date; } }
Crea DAOs
Room usa objetos de acceso a datos (DAO) para definir métodos que acceden a la base de datos. Sigue las instrucciones del artículo para acceder a los datos con DAO de Room a fin de reemplazar tus métodos de consulta existentes por DAOs.
Crea una clase de base de datos
Las implementaciones de Room usan una clase de base de datos para administrar una instancia de la base de datos. Tu clase de base de datos debe extender RoomDatabase
y hacer referencia a todas las entidades y DAOs que definiste.
Kotlin
@Database(entities = [User::class], version = 2) @TypeConverters(DateConverter::class) abstract class UsersDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
Java
@Database(entities = {User.class}, version = 2) @TypeConverters(DateConverter.class) public abstract class UsersDatabase extends RoomDatabase { public abstract UserDao userDao(); }
Define una ruta de migración
Dado que el número de versión de la base de datos cambiará, debes definir un objeto Migration
para indicar la ruta de migración, de modo que Room conserve los datos existentes en la base de datos.
Siempre que el esquema de la base de datos no cambie, esta puede ser una implementación vacía.
Kotlin
val MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { // Empty implementation, because the schema isn't changing. } }
Java
static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { // Empty implementation, because the schema isn't changing. } };
Para obtener más información sobre las rutas de migración de bases de datos en Room, consulta Cómo migrar tu base de datos.
Actualiza la creación de instancias de la base de datos
Después de definir una clase de base de datos y una ruta de migración, puedes usar Room.databaseBuilder
para crear una instancia de la base de datos con la ruta de migración aplicada:
Kotlin
val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "database-name" ) .addMigrations(MIGRATION_1_2).build()
Java
db = Room.databaseBuilder( context.getApplicationContext(), UsersDatabase.class, "database-name" ) .addMigrations(MIGRATION_1_2).build();
Prueba tu implementación
Asegúrate de probar tu nueva implementación de Room:
- Sigue las instrucciones que se muestran en Cómo probar migraciones para probar la migración de tu base de datos.
- Sigue las instrucciones en Cómo probar tu base de datos para probar tus métodos DAO.
Migración incremental
Si tu app usa una base de datos grande y compleja, quizás no sea posible migrarla a Room de una sola vez. En cambio, puedes implementar las entidades de datos y la base de datos de Room como primer paso y, luego, migrar tus métodos de consulta a DAO. Para ello, reemplaza tu clase auxiliar de base de datos personalizada por el objeto SupportSQLiteOpenHelper
que recibes de RoomDatabase.getOpenHelper()
.
Recursos adicionales
Para obtener más información sobre la migración de SQLite a Room, consulta los siguientes recursos adicionales: