Cómo migrar de SQLite a Room

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:

  1. 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 propiedad tableName para indicar que la tabla resultante debe tener un nombre diferente al nombre de la clase.
  2. Agrega la anotación @PrimaryKey al campo de clave primaria.
  3. 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 propiedad name con el nombre de columna correcto.
  4. 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.
  5. 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:

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:

Blogs