You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:50:26