Migración de Room a Realm en Android Studio

Clase 18 de 19Curso de Android: Modo Offline con Room y Realm

Resumen

La migración de bases de datos en Android es un proceso fundamental que todo desarrollador debe dominar. Cambiar de Room a Realm puede parecer intimidante, pero con los pasos adecuados, este proceso se vuelve sencillo y eficiente. En este contenido, exploraremos cómo realizar esta migración manteniendo la integridad de los datos y aprovechando las características únicas de cada sistema de almacenamiento.

¿Cómo migrar de Room a Realm en Android?

Migrar de una base de datos a otra en Android requiere principalmente modificaciones en la capa de datos de nuestra aplicación. El proceso implica crear mappers adecuados y ajustar las implementaciones de los repositorios para trabajar con la nueva base de datos.

Para comenzar, necesitamos crear los mappers necesarios que convertirán nuestras entidades entre los diferentes formatos:

// Mapper de OrderObject (Realm) a Domain
fun orderObjectToDomain(order: OrderObject): Order {
    return Order(
        id = order.id,
        customerName = order.customerName,
        item = order.item,
        total = order.total,
        image = order.image
    )
}

// Mapper de Domain a OrderObject (Realm)
fun domainToOrderObject(order: Order): OrderObject {
    return OrderObject().apply {
        id = order.id
        customerName = order.customerName
        item = order.item
        total = order.total
        image = order.imageUrl
    }
}

// Mapper de PreorderObject a Domain
fun preorderObjectToDomain(preorder: PreorderObject): Preorder {
    return Preorder(
        id = preorder.id,
        customerName = preorder.customerName
        // Otros campos necesarios
    )
}

¿Qué cambios se requieren en los repositorios?

Una vez creados los mappers, debemos modificar las implementaciones de los repositorios para utilizar Realm en lugar de Room:

  1. Modificar el repositorio de PreOrder:
// Antes (con Room)
// savePreorderRun(preorder)

// Ahora (con Realm)
savePreorderReal(PreorderObject().apply {
    id = preorder.id
    customerName = preorder.customerName
    // Otros campos
})
  1. Actualizar los métodos de listado:
// Antes
// getPreordersRun().map { it.toDomain() }

// Ahora
getPreordersReal().map { it.toDomain() }
  1. Modificar los métodos de eliminación:
// Antes
// deletePreorderRun(id)

// Ahora
deletePreorderReal(id)

Es importante destacar que al cambiar de Room a Realm, debemos considerar las diferencias fundamentales entre ambas bases de datos. Por ejemplo, Realm no genera automáticamente las claves primarias como lo hace Room con @PrimaryKey(autoGenerate = true).

¿Cómo manejar las diferencias entre Room y Realm?

Una de las principales diferencias entre Room y Realm es la gestión de las claves primarias. En Realm, debemos generar manualmente los IDs:

// En el objeto Realm
id = System.currentTimeMillis()

Este enfoque utiliza el tiempo actual en milisegundos como ID único, lo que generalmente funciona bien para aplicaciones con volumen moderado de datos.

Otra diferencia importante es el manejo de errores. Es recomendable implementar un mecanismo de captura de excepciones para evitar que la aplicación se cierre inesperadamente:

try {
    savePreorderReal(preorderObject)
} catch (e: Exception) {
    // Manejar la excepción
    Log.e("Database", "Error al guardar preorden: ${e.message}")
}

¿Cómo probar la migración correctamente?

Para verificar que la migración funciona correctamente, debemos probar diferentes escenarios:

  1. Crear registros en la nueva base de datos
  2. Verificar la sincronización con el servidor remoto
  3. Probar el funcionamiento offline
  4. Comprobar que los datos se recuperan correctamente

Si encontramos problemas durante las pruebas, una solución rápida es limpiar los datos de la aplicación:

  1. Buscar la aplicación en la configuración del dispositivo
  2. Ir a Información de la aplicación
  3. Limpiar almacenamiento o caché
  4. Reiniciar la aplicación

Este enfoque es útil durante el desarrollo, pero en producción necesitaremos implementar estrategias de migración más sofisticadas para preservar los datos de los usuarios.

¿Cuándo elegir Room o Realm?

La elección entre Room y Realm debe basarse en las necesidades específicas de tu aplicación:

  • Room es ideal para aplicaciones que requieren una base de datos SQL tradicional con soporte completo para consultas complejas y transacciones.
  • Realm ofrece un modelo orientado a objetos y sincronización en tiempo real, lo que lo hace adecuado para aplicaciones que necesitan actualizaciones frecuentes y trabajo offline.

La decisión debe tomarse al inicio del proyecto, considerando factores como el volumen de datos, la complejidad de las consultas y los requisitos de sincronización.

La migración entre bases de datos es un proceso que requiere planificación y pruebas exhaustivas, pero siguiendo los pasos adecuados, podemos realizarla de manera eficiente y sin pérdida de datos. Lo más importante es entender las ventajas y desventajas de cada sistema de almacenamiento para tomar decisiones informadas desde el principio del desarrollo.

¿Has realizado alguna migración de base de datos en tus proyectos? Comparte tu experiencia en los comentarios y cuéntanos qué sistema de almacenamiento prefieres para tus aplicaciones Android.