0

我正在使用 Room DB 来获取回收站视图。每行都有一个删除图标来删除该项目。我也想从 Room db 中删除相同的项目。我已经完成了下面的代码,但它只反映在列表中,刷新后再次从 db 加载已删除的数据。

带有删除侦听器的适配器类:

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());
    }
}

数据库道

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

请帮助我。

4

2 回答 2

0

首先,AsyncTask 现在是一个过时的类,我建议你看看协程或 rxjava。

其次,您的适配器从 0 开始计数元素。在数据库中,如果您选择了主键的自动增量,则从 1 开始报告。也许正因为如此,存在问题

于 2022-01-03T21:50:15.830 回答
0

列表中的位置将不等于正确的 id。

位置是基于 0 的,分配的第一个 id 将为 1,除非您专门将分配的第一个 id 设置为 0(不太可能)逐渐位置和 id 之间的相关性将变得越来越复杂。

如果单击列表中的第一项,如果没有 id 设置为 0 的行,则不会删除任何内容。

如果没有删除任何行,其他行将被淘汰 1。如果您然后单击删除列表中的第二个项目,则位置将为 1,假设 id 为 1 的行存在并被删除,那么现在最低 id 为 2。所以现在单击第一个或第二个项目列表不会导致删除。如果单击第三个项目并进行删除,那么现在最低的 id 是 3 ....

简而言之,您需要获取该位置的 MovieData 对象的实际 id。

于 2022-01-03T17:02:15.310 回答