Android Java:SQLite数据与RecyclerView条目删除功能失效排查
问题分析与修复方案
核心问题排查
- 删除参数为空:适配器中定义的
String name从未赋值,调用db.deleteCourse(name)时传入空字符串,数据库无法匹配到目标记录执行删除 - 未同步更新RecyclerView:即使数据库删除成功,也未从
BookingArrayList中移除对应条目,也没通知适配器刷新UI - 删除条件不可靠:用
name作为删除依据,若存在同名记录会误删,建议改用表中唯一标识(如serviceID) - TextView赋值隐患:
holder.tv_paymentStatus.setText(...)直接传入int类型的bookingcheck,会被Android当成资源ID,导致显示异常
代码修复步骤
1. 修复适配器的删除逻辑
修改bookingRecycleView的onBindViewHolder方法,正确获取目标数据、更新数据源并通知适配器:
@Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Booking modal = BookingArrayList.get(position); holder.tv_name.setText(modal.getName()); holder.tv_bookingBategory.setText(modal.getNotes()); // 修复int转字符串的问题 holder.tv_paymentStatus.setText(String.valueOf(modal.getBookingCheck())); holder.button_delete_booking.setOnClickListener(view -> { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("Are you sure you want to delete this?"); builder.setMessage("Deleted data cannot be undone."); builder.setPositiveButton("Yes", (dialog, which) -> { db = new DBhelper(context); // 正确获取当前条目的name(或改用serviceID更可靠) String targetName = modal.getName(); // 执行数据库删除 db.deleteCourse(targetName); // 从数据源移除条目并通知适配器 BookingArrayList.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, BookingArrayList.size()); Toast.makeText(context, "Deleted successfully", Toast.LENGTH_SHORT).show(); }); builder.setNegativeButton("No", (dialog, which) -> dialog.dismiss()); AlertDialog dialog = builder.create(); dialog.show(); }); }
2. 优化数据库删除方法(推荐)
改用serviceID作为删除条件,避免同名记录误删,修改DBhelper中的deleteCourse方法:
public void deleteCourse(int serviceID) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_NAME, "serviceID=?", new String[]{String.valueOf(serviceID)}); db.close(); }
同时适配器中调用时改为:
int targetId = modal.getBookingid(); // 确保Booking类的getBookingid()返回serviceID db.deleteCourse(targetId);
3. 补充页面刷新逻辑(可选)
在BookingActivity中添加onResume方法,确保从添加页面返回后能刷新列表:
@Override protected void onResume() { super.onResume(); BookingArrayList.clear(); BookingArrayList.addAll(db.readCourses()); BookingRecycleView.notifyDataSetChanged(); }
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

