Implementación de CRUD en Room y gestión de eventos en Android
Clase 19 de 20 • Curso de Patrones MVVM en Android
Resumen
Al desarrollar aplicaciones, es crucial gestionar adecuadamente el ciclo de vida de los datos, desde su creación hasta su eliminación.
¿Cómo se implementa un método de eliminación en la base de datos?
Primero, necesitamos definir un método para borrar los registros en nuestra base de datos. Este proceso inicia en la capa de datos:
interface FoodDao {
@Delete
suspend fun deleteTrackedFood(trackedFood: TrackedFoodEntity)
}
El método deleteTrackedFood
es fundamental para manipular los datos almacenados en la base de datos local. Al definir este método, podemos eliminar entradas específicas de la aplicación.
¿Cómo se conecta el método de eliminación con la lógica de negocio?
El siguiente paso es integrar este método en la capa de dominio, específicamente en el repositorio, que actúa como un puente entre la base de datos y la lógica de negocio de la aplicación:
class TrackerRepository(private val dao: FoodDao) {
suspend fun deleteTrackedFood(trackedFood: TrackedFood) {
dao.deleteTrackedFood(trackedFood.toEntity())
}
}
En esta parte, se observa el uso de un patrón Repository
para encapsular la lógica de acceso a datos, promoviendo un código más limpio y mantenible.
¿Qué rol juegan los casos de uso en la eliminación de datos?
Los casos de uso articulan la lógica que une la capa de datos con la de presentación. Implementamos un Use Case
que permita, desde la interfaz de usuario, ejecutar la acción de eliminación:
class DeleteTrackedFoodUseCase(private val repository: TrackerRepository) {
suspend operator fun invoke(trackedFood: TrackedFood) {
repository.deleteTrackedFood(trackedFood)
}
}
Este Use Case
facilita la interacción con el repositorio para eliminar un TrackedFood
, ofreciendo un camino claro y estructurado para llamar las funciones necesarias desde la capa de presentación.
¿Cómo asegurar una interfaz de usuario reactiva?
Finalmente, es imperativo garantizar que la interfaz de usuario (UI) se actualice en tiempo real para reflejar los cambios de datos, utilizando el patrón MVVM y flows
de Kotlin para la reactividad. En el ViewModel
se manejan eventos que disparan cambios de estado:
class TrackerViewModel : ViewModel() {
// Métodos para gestionar eventos de UI, como eliminaciones
fun onEvent(event: TrackerOverviewEvent) {
when (event) {
is TrackerOverviewEvent.OnDeleteTrackedFoodClick -> {
viewModelScope.launch {
deleteTrackedFoodUseCase(event.trackedFood)
refreshFoods()
}
}
// Otros eventos...
}
}
}
Usar viewModelScope.launch
permite lanzamientos asíncronos, asegurando que las operaciones de UI no bloqueen el hilo principal.
¿Cómo verificar que la aplicación funcione correctamente?
Al probar la aplicación, es vital asegurarse de que las interacciones con el selector de fechas y las eliminaciones se reflejen instantáneamente, demostrando que la aplicación no solo es funcional, sino también fluida y receptiva:
- Verifica que, al eliminar un alimento, este desaparece inmediatamente de la UI.
- Probar el avance y retroceso en las fechas actualiza las comidas mostradas correctamente.
- Asegúrate de que cualquier dato agregado en fechas futuras se visualice solo en el contexto correcto.
Estas pruebas aseguran que la aplicación es robusta y capacita al desarrollador para entregar un producto de calidad. La implementación de un CRUD efectivo con eliminación de datos es esencial para aplicaciones que gestionan información crítica de usuario como alimentos o calorías consumidas. Con estos elementos correctamente integrados, se construye una aplicación moderna, intuitiva y altamente funcional.