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.

La eliminación de la base de datos de Room en Android no funciona.

Estoy trabajando con una Base de Datos de Room para RecyclerView. Y hay un ícono de eliminar en cada fila para eliminar ese elemento. Quiero eliminar el mismo elemento de la Base de Datos de Room también. He hecho el siguiente código, pero solo se refleja en la lista y después de actualizar, vuelve a cargar los datos eliminados de la base de datos.

Clase adaptadora con el escuchador de eliminación:

btn_delete.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        deletePosition = getAdapterPosition();
        DeleteTask deleteTask = new DeleteTask();
        deleteTask.execute();
        alertDialog.dismiss();
    }
});
public class DeleteTask extends AsyncTask<void, void,="" void=""> {
    @Override
    protected Void doInBackground(Void... integers) {
        DatabaseClient.getInstance(activity)
        .getAppDatabase()
        .DraftDataDao()
        .deleteById(deletePosition);
        return null;
    }
}

@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
    inProgressModelList.remove(deletePosition);
    notifyItemRemoved(deletePosition);
    notifyItemRangeChanged(deletePosition, inProgressModelList.size());
    globalData.setInprogress_count(inProgressModelList.size());
}

Clase DatabaseDao

@Query("DELETE FROM MovieData WHERE Id = :id")
public abstract void deleteById(int id);

Por favor, ayúdame con esto.</void,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para eliminar el elemento de la base de datos Room junto con el RecyclerView, debes asegurarte de que la operación de eliminación en la base de datos Room también se realice en un hilo separado. En tu implementación actual, estás utilizando AsyncTask para realizar la eliminación en la base de datos Room, lo cual es un buen comienzo.

    Sin embargo, el problema aquí es que estás eliminando el elemento de la lista (inProgressModelList) antes de que se elimine realmente de la base de datos Room. Por lo tanto, cuando actualizas la lista, el elemento eliminado se carga nuevamente desde la base de datos Room y aparece en el RecyclerView.

    Para solucionar esto, debes asegurarte de que el elemento se elimine primero de la base de datos Room y, una vez que esa operación sea exitosa, eliminarlo de la lista y notificar al adaptador. Aquí hay una implementación actualizada para tu DeleteTask:

    public class DeleteTask extends AsyncTask<void, void,="" void=""> {
        @Override
        protected Void doInBackground(Void... integers) {
            int id = inProgressModelList.get(deletePosition).getId();
            DatabaseClient.getInstance(activity)
                    .getAppDatabase()
                    .DraftDataDao()
                    .deleteById(id);
            return null;
        }
    
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            inProgressModelList.remove(deletePosition);
            notifyItemRemoved(deletePosition);
            notifyItemRangeChanged(deletePosition, inProgressModelList.size());
            globalData.setInprogress_count(inProgressModelList.size());
        }
    }
    

    En esta implementación actualizada, primero obtenemos la ID del elemento que se va a eliminar de inProgressModelList. Luego realizamos la operación de eliminación en la base de datos Room utilizando esta ID. Una vez completada esa operación, eliminamos el elemento de inProgressModelList, notificamos al adaptador de la eliminación y actualizamos el contador en globalData.</void,>

Comments are closed.