es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Android – Obtén un objeto único de SQLite utilizando Room

Estoy trabajando en mi primera aplicación donde puedo agregar, editar, eliminar,… objetos en una base de datos SQ Lite. Hasta ahora, todo funciona bien. También funciona bien cargar todos los objetos almacenados con LiveData.

¿Alguien puede aconsejarme cómo debería verse el código en el repositorio cuando quiero cargar un solo objeto de mi base de datos?

El código en el Dao se ve así:

@Query(“SELECT * FROM lens_table WHERE id = :lensId LIMIT 1″)
Lens getLensById(int lensId);

Intenté con un código simple como este en el repositorio:

public Lens getLensById(int id) {
Lens lens = lensDao.getLensById(id);
}

Pero eso no funciona; supongo que el problema es que esto debería hacerse en una tarea asíncrona, como lo uso para eliminar un elemento.

public void delete(Lens lens) {
new DeleteLensAsyncTask(lensDao).execute(lens);
}

private static class DeleteLensAsyncTask extends AsyncTask<lens, void,=”” void=””> {
private final LensDao lensDao;

private DeleteLensAsyncTask(LensDao lensDao) {
    this.lensDao = lensDao;
}

@Override
protected Void doInBackground(Lens... lenses) {
    lensDao.delete(lenses[0]);
    return null;
}

}

Y ahí es donde empiezo a tener problemas; ¿cómo deberían verse los métodos en el repositorio?

En la actividad, respectivamente en el ViewHolder, estoy usando este código que se llama desde el método onCreate de la actividad.

public Lens getLensById(int id) {
return repository.getLensById(id);
}

¡Muchas gracias!</lens,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para cargar un solo objeto de la base de datos, el código en el repositorio debe ser modificado para usar un AsyncTask y realizar la operación de la base de datos en un hilo en segundo plano. Aquí hay una implementación de ejemplo:

    public LiveData<lens> getLensById(int id) {
        return lensDao.getLensById(id);
    }
    

    En este caso, el método retorna un objeto LiveData en lugar del objeto Lens directamente. Esto se debe a que la operación de la base de datos puede tomar algún tiempo para completarse, y LiveData nos permite observar el resultado y actualizar la interfaz de usuario una vez que la operación haya terminado.

    Para utilizar este método en una actividad o en un view holder, puedes observar el objeto LiveData y actualizar la interfaz de usuario de acuerdo. Aquí hay una implementación de ejemplo:

    repository.getLensById(id).observe(this, new Observer<lens>() {
        @Override
        public void onChanged(@Nullable Lens lens) {
            if (lens != null) {
                // Actualizar la interfaz de usuario con los datos del lente
            }
        }
    });
    

    En este caso, la actividad o el view holder observa el objeto LiveData devuelto por el método del repositorio. Una vez que la operación de la base de datos se completa, se llama al método onChanged, lo que te permite actualizar la interfaz de usuario con los datos del lente.

Comments are closed.