Android中RecyclerView删除条目时如何同步删除SQLite数据库数据
问题核心原因
- 类名不匹配:适配器中声明的数据库实例是
DBmain类型,但实际你的数据库工具类命名为SqliteHelper,实例化错误的类导致数据库操作完全没有执行 - 删除参数错误:你把列表的位置
position直接传给数据库的delete方法当做主键id删除,数据库的自增id和列表的位置没有绑定关系,要么删错数据要么找不到对应数据
修改方案
第一步 给Model类补充id字段
你的Model类需要存储对应数据库条目的主键id,修改Model类增加id属性和对应的get方法:
public class Model { private int id; // 对应数据库的主键id private String sname; private String ssubject; // 原有构造方法、其他get/set方法保留,新增getId方法 public int getId() { return id; } }
注意从数据库查询数据填充modelArrayList的时候,一定要把数据库返回的主键id赋值给Model的id属性。
第二步 修改适配器的删除逻辑
替换错误的数据库类,把传position改为传当前条目的数据库主键id:
@Override public void onBindViewHolder(@NonNull MyAdapter.ViewHoder holder, int position) { Model model = modelArrayList.get(position); holder.txtname.setText(model.getSname()); holder.txtsub.setText(model.getSsubject()); holder.txtimag.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int currentPosition = holder.getAdapterPosition(); // 增加无效位置判断,避免列表滑动时点击出现崩溃 if (currentPosition != RecyclerView.NO_POSITION) { // 替换为你实际的数据库类SqliteHelper SqliteHelper sqliteHelper = new SqliteHelper(context); // 获取当前条目对应的数据库主键id Model currentModel = modelArrayList.get(currentPosition); sqliteHelper.delete(currentModel.getId()); // 再更新列表数据 modelArrayList.remove(currentPosition); notifyItemRemoved(currentPosition); notifyItemRangeChanged(currentPosition, modelArrayList.size()); } } }); }
可选优化
可以修改数据库的delete方法,用占位符避免SQL注入,同时返回删除结果判断是否操作成功:
public boolean delete(int id) { SQLiteDatabase sqLiteDatabase = this.getWritableDatabase(); int affectRow = sqLiteDatabase.delete(TABLENAME, "id=?", new String[]{String.valueOf(id)}); sqLiteDatabase.close(); return affectRow > 0; }
内容的提问来源于stack exchange,提问作者pintu
相关产品推荐
相关产品推荐

