当我将 arraylist 传递给 DBHelper 以更新数据库时出现 IndexOutOfBoundException (Android SQlite)

IndexOutOfBoundException when i pass arraylist to DBHelper to update database (Android SQlite)

我是 android 的新人,正在尝试使用数据库制作管理会员应用程序。我想在这里做的是,当用户购买任何饮料时,它应该在数据库中将饮料名称更改为“已购买”,但是当我将 Arraylist 传递给 db class 时,它显示我的 Arraylist 是空的。

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
        at java.util.ArrayList.get(ArrayList.java:437)
        at com.shashank.managemembers.DB_Controller.update_available(DB_Controller.java:88)
        at com.shashank.managemembers.TempActivity.onClick(TempActivity.java:90)

userInputActivity

这里用户选择 he/she 想要的饮料,当​​他按下完成按钮时,它应该更改包含饮料名称的数据库。 我正在用 Toast 消息检查它,表明 ArrayList 不为空。 Toast 消息总是根据用户的选择出现,但 db class 抛出错误。

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(TempActivity.this, selectedInListView.get(0), Toast.LENGTH_SHORT).show();
                dbController.update_available(code, selectedInListView);
                onBackPressed();
            }
        });

这里 selectedInListView 有很多项目,当我将它传递给 dbController.update_available。

dbController.java

这里我在数据库中有 9 列,从 DRINK1 到 DRINK9。

public void update_available(String memberCode, ArrayList<String> BoughtDrinks) {
    Cursor cursor = this.getReadableDatabase().rawQuery("SELECT * FROM MEMBERS WHERE MEMBERCODE = '" + memberCode + "'", null);
    int count = cursor.getColumnCount();
    while (cursor.moveToNext()) {
        for (int i = 5; i < count; i++) {
            if (!cursor.getString(i).contains(BoughtDrinks.get(0))) {
                this.getReadableDatabase().execSQL("UPDATE MEMBERS SET DRINK"+ i +"='Bought' WHERE DRINK" + i +"='" + BoughtDrinks.get(0) + "'" + "AND MEMBERCODE='" + memberCode + "'");
                if(BoughtDrinks.size() > 0 ){
                    BoughtDrinks.remove(0);
                }
            }
        }
    }
    cursor.close();
}

我不明白为什么在我传递带有元素的 ArrayList 时会抛出错误。

您收到此错误是因为,如果 BoughtDrinks.size()>0,您的代码会在 0 处删除项目,然后当您在删除后尝试在 0 处获取项目时,for 循环在 0.So 处获取项目所有项目,您将获得索引 IndexOutOfBoundsException.to 避免仅添加 if() 条件。

 public void update_available(String memberCode, ArrayList<String> BoughtDrinks) {
        Cursor cursor = this.getReadableDatabase().rawQuery("SELECT * FROM MEMBERS WHERE MEMBERCODE = '" + memberCode + "'", null);
        int count = cursor.getColumnCount();
        while (cursor.moveToNext()) {
            for (int i = 5; i < count; i++) {
                if ( BoughtDrinks.size()>0 && !cursor.getString(i).contains(BoughtDrinks.get(0))) {
                    this.getReadableDatabase().execSQL("UPDATE MEMBERS SET DRINK"+ i +"='Bought' WHERE DRINK" + i +"='" + BoughtDrinks.get(0) + "'" + "AND MEMBERCODE='" + memberCode + "'");
                    if(BoughtDrinks.size() > 0 ){
                        BoughtDrinks.remove(0);
                    }
                }
            }
        }
        cursor.close();
    }