¿Cómo se utiliza Room para gestionar datos en una aplicación?
Room es una librería de base de datos de persistencia para aplicaciones que facilita la interacción con la base de datos SQLite de Android. Al utilizar anotaciones y objetos de entidad, Room ofrece una API limpia que permite realizar operaciones CRUD sin complicaciones. En este contenido, abordaremos el uso de Room para guardar y recuperar datos, específicamente en el contexto de transferencias.
¿Cómo guardar transferencias con Room?
Para guardar transferencias en una base de datos usando Room, debemos seguir un proceso estructurado:
Definición de la Entidad: Primero, se define una entidad que representa la tabla en la base de datos. En este caso, usamos TransferEntity, que almacena información como transactionDate, amount, y datos del usuario.
Creación del Objeto Database: Utilizamos una clase anotada con @Database para definir la base de datos. Esta contiene referencias a las entidades que forman parte del modelo, asegurando que Room reconozca las tablas a utilizar.
@Database(entities =[TransferEntity::class], version =1)abstractclass AppDatabase :RoomDatabase(){abstractfuntransferDao(): TransferDao
}
Almacenamiento de la Transferencia: Al tener una instancia del objeto de la base de datos, realizamos la operación de guardar una transferencia. Creamos un TransferEntity con los valores requeridos y utilizamos el método definido en el DAO para insertarlo.
Manejo de Transacciones: Room permite el uso de transacciones para asegurar que se realicen operaciones complejas de manera segura, lo cual es crucial para mantener la integridad de los datos.
¿Cómo leer datos y mostrarlos?
Leer datos almacenados previamente es igual de importante que guardarlos. Aquí se explica cómo hacerlo integrando otras funcionalidades:
Consulta de Transferencias: Para recuperar transferencias, se crean métodos en el DAO que devuelven listas de entidades según algunos criterios.
@Daointerface TransferDao {@Query("SELECT * FROM TransferEntity WHERE userIdFrom = :userId")fungetTransfersForUser(userId: String): List<TransferEntity>}
Mostrar en Pantalla: Las transferencias recuperadas se pueden mostrar en pantalla. Un ejemplo sencillo es concatenar los detalles en una sola cadena y mostrarlo mediante un Toast.
val transfers = transferDao.getTransfersForUser("PlatziUser")val displayString = transfers.joinToString("\n"){"${it.transactionDate}: ${it.amount}"}Toast.makeText(context, displayString, Toast.LENGTH_LONG).show()
Uso de Handlers para Tareas Asíncronas: Al utilizar Handler y Runnable, podemos ejecutar tareas después de cierto tiempo, como cargar y mostrar datos varios segundos después de realizar una transferencia.
Handler().postDelayed({// Actualizamos la interfaz con los nuevos datos},3000)
¿Qué ocurre si encontramos un error?
Trabajando con Room, es fundamental manejar los posibles errores. Un error común podría ser una configuración incorrecta de las entidades. Asegúrate de que la entidad está correctamente anotada y que las versiones de la base de datos están bien definidas.
Al final, la clave está en los fundamentos sólidos de cómo funciona Room con las entidades, DAO, y el objeto Database. Room transforma la interacción con bases de datos en una tarea más sencilla y eficiente, permitiendo concentrarse en la lógica de negocio. Es emocionante ver cómo pequeños cambios mejoran la eficiencia de una aplicación completa y por eso, ¡sigue explorando y mejorando tus aplicaciones!
Aquí mismo en Android Studio en la barra de abajo App inspection pueden ver las tablas de la base de datos
Si les tira error relacionado con el schema es porque no le han indicado que no lo quieren
@Database(entities =[Entity::class], version =1, exportSchema =false)
exportSchema es muy util cuando se trabajan con migraciones. Les dejo este video por si les interesa
Hay dos cosos que el profesor hace muy seguidas, que no debemos hacer, pero que para fines prácticos del curso esta bien, lo primero es el uso del double bang (!! )para que no pidra comprobar si el valor es nulo y por otro lado el uso de delay como postDelayed que usa para simular el tiempo que podría tardar una consulta en la base de datos, pero que en nuestra aplicaiones no deberiamos usar.
Colocando el DAO en el frament para tomar los metodos implementados para hacer el CRUD correspondiente
Si se van a transferencias antes de que termine el progress bar se les va a detener la app
·hace 10 segundos
ApplicationDatabases, hay que decirle que es de tipo @Database([Nombredeentidad::class], version =1)
Donde guarda los datos Room, en el móvil?
Donde exactamente?
Y que pasa si la app le da por crecer mucho, no colapsaría el móvil del usuario?
Room usa SQLite.
Guarda los datos en el mismo celular, en memoria.
Más especifico /data/data/[com.paquete_de_app...]/databases/basededatos.db
Probablemente te vayas a preguntar ¿Y cuál es la dirección de la carpeta de descargas?
Es /storage/emulated/0/Downloads
Como te puedes dar cuenta, no vas a poder verla así con un simple explorador de archivos.
¿Qué pasa si crece demasiado?
Lo mismo que si tuvieras un archivo enorme, la app puede consumir mucha memoria.
val handler = Handler()
handler.postDeayed(runnable, 30000)
Para tardar la ejecucion
Tengo problemas con la app al compilarla, alguien me puede ayudar?