当前位置: 首页 > 知识库问答 >
问题:

如何在sql lite中从数据库获取要删除的id数据-setOnLongClickListener错误

年健
2023-03-14

我有一个recyclerview和SQLLite数据库。我将城市名称保存在SQLite数据库中,并在recyclerview中显示它们。当城市在recyclerview中设置为setOnclickListener时,城市的天气就会显示出来,我通过从SQLLite数据库中获取城市的id来实现这一点。

arrayList.get(position).id

它在setOnClickListener中工作,但在setOnLongClickListener中不工作

当我长按时,我想删除recyclerview中的城市名称,但不想删除,因为它不起作用。

此错误出现在logcat中:“java.lang.IndexOutOfBoundsException:索引:0,大小:0”或类似的内容

我如何解决这个问题?

我的适配器类

public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder>  {

ArrayList<City> arrayList;
Context context;
SQLiteDatabase db ;
Cursor cursor;
int dbId;



public Adapter(ArrayList<City> arrayList ,Context context ){
    this.arrayList = arrayList;
    this.context = context;

    db = context.openOrCreateDatabase("City",MODE_PRIVATE,null);


}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    RecyclerviewRowBinding recyclerviewRowBinding = 
    RecyclerviewRowBinding.inflate(LayoutInflater.from(parent.getContext()),
    parent,
    false);
    return new MyViewHolder(recyclerviewRowBinding);

}

@Override
public void onBindViewHolder(@NonNull Adapter.MyViewHolder holder, int position) {

    holder.binding.MytxtCities.setText(arrayList.get(position).cityName);


    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {

            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setIcon(R.drawable.warningicon);
            builder.setMessage("Are you sure that you want to delete "+arrayList.get(position).cityName);
            builder.setPositiveButton("Ok", (dialog, which) -> {

                arrayList.remove(position);
                notifyItemRemoved(position);
                notifyItemRangeChanged(position,arrayList.size());

                dbId = arrayList.get(position).id; // <---the error is in this code
                System.out.println("dbId"+dbId);

                //db.execSQL("DELETE FROM city WHERE id ='" + arrayList.get(position).id + "'");


                cursor = db.rawQuery("SELECT * FROM city WHERE id=?",new String[]{String.valueOf(dbId)});
                Result(cursor);



            }).setNegativeButton("Cancel", (dialog, which) -> {

                //doing nothing
            }).show();


            return true;
        }


    });


    holder.itemView.setOnClickListener(v -> {

        Intent intent = new Intent(holder.itemView.getContext(),MainActivity.class);
        intent.putExtra("citId",arrayList.get(position).id); // <-- it works very well here and sends with intent
        holder.itemView.getContext().startActivity(intent);
    });
}


private void Result(Cursor cursor){

    if(cursor.getCount() > 0){

        db.delete("city","id=?",new String[]{String.valueOf(dbId)});
        notifyDataSetChanged();
    }
    else{
        Toast.makeText(context,"something went wrong !",Toast.LENGTH_LONG).show();
    }


}


@Override
public int getItemCount() {
    return arrayList.size();
}



public class MyViewHolder extends RecyclerView.ViewHolder {
    TextView Mytxt_cities;
    private RecyclerviewRowBinding binding;

    public MyViewHolder(@NonNull RecyclerviewRowBinding binding) {
        super(binding.getRoot());
        this.binding = binding;
        Mytxt_cities = itemView.findViewById(R.id.Mytxt_cities);



    }


 }
 }

共有1个答案

邢法
2023-03-14

你的代码里有

arrayList.remove(position);

下面几行

dbId = arrayList.get(position).id; // <---the error is in this code

调用remove后,您的数组列表为空,但您仍在尝试在位置获取此项,因此您正在获取索引自动边界异常:索引:0,大小:0-您正在尝试在位置=0获取项,数组为空

尝试在从数组中删除之前移动获取dbId

            dbId = arrayList.get(position).id;
            arrayList.remove(position);
            notifyItemRemoved(position);
            //notifyItemRangeChanged(position,arrayList.size()); // this line is unnecessary

 类似资料:
  • 问题内容: 这是我的类,用于从数据库中获取数据 这是我的文件: 当我运行该程序时,出现异常后,请帮助我如何解决它。我是Hibernate的新手,尝试学习但被卡住了。 虽然我能够将数据存储在数据库中,但我有2个用于第一和第二类的数据获取数据,但在获取数据时遇到了问题PLZ帮助。 问题答案: 让我引述一下: 据我所知,您正在使用表名。 所以应该是这样的:

  • 我开始使用一个代码,使用Firebase实时数据库。我将它实现到我的解决方案中。连接和控制非常完美,所以我将其用于生产环境。 一段时间后,我在升级,我需要再次删除所有数据-但请稍候,控制台中最高根级别不再有删除按钮,并且一次只允许在一个选定项目中: 上次更新仅显示此消息,没有后续步骤: 只读 问:如何一次删除所有数据?

  • 我需要你帮我。我想在RecyclerView中通过SwipeToDelete删除数据库中的数据。 我已经有了一个从RecycleView中删除项目的Swipe类,我可以从该列表中删除项目,但不能从数据库中删除。 我尝试在NoteAdapater(回收器适配器)中调用数据库,并使用removeItem(int-position)方法删除所需的项,如下所示: 这是Main Active代码: 删除数据

  • 我制作了一个JTable,其中填充了数据库中的数据。它从textfields中获取数据并将其添加到表和数据库中。问题是我有一个删除按钮,我让它从表本身删除选定的行(使用defaultTableModel),但它不会从实际的数据库中删除该数据。当我再次运行该程序时,删除的行再次出现在JTable中。 这可能会变得混乱,但希望有人能找出我错过了什么。帮助将会很感激,但不要,我的时间很少,不能完全大修我

  • 我得到了这段代码,但我认为这是不好的方法,如果有像100K的结果,它会返回100K的新用户怎么办?对于,我是否可以使用其他方法,但我不太确定如何实现。另外,是否应该使用块?

  • 问题内容: 我有2种情况,我要在codeigniter中提取同一表的全部数据和行总数,我想知道那是一种方法,可以从中获取行总数,整个数据和3个最新插入的记录通过一个代码在同一张桌子上 两种情况的控制器代码如下(尽管我分别使用不同的参数将其应用于每种情况) 1)从codeigniter中的表中获取全部数据 型号代码 查看代码 2)在Codeigniter中从表中获取行数 查看代码 问题答案: 您只能