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,>
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
: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 deinProgressModelList
, notificamos al adaptador de la eliminación y actualizamos el contador englobalData
.</void,>