【问题标题】:IndexOutOfBoundException when i pass arraylist to DBHelper to update database (Android SQlite)当我将 arraylist 传递给 DBHelper 以更新数据库(Android SQlite)时出现 IndexOutOfBoundException
【发布时间】:2021-06-05 13:46:31
【问题描述】:

我是 android 新手,正在尝试使用数据库制作管理会员应用程序。我在这里要做的是,当用户购买任何饮料时,它应该在数据库中将饮料名称更改为“购买”,但是当我将 Arraylist 传递给 db 类时,它显示我的 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$2.onClick(TempActivity.java:90)

用户输入活动

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

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

这里我在 db 中有 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 时会引发错误。

【问题讨论】:

  • 显然,BoughtDrinkssize()0,因此BoughtDrinks.get(0) 会抛出上述异常。 --- 关于代码的两点说明: - 变量名应该以小写字母开头 (BoughtDrinks -> boughtDrinksv) - 方法名应该写成 camelCase,而不是 snake_case (update_available -> @ 987654335@)
  • 也许最初列表不是空的,但在循环中有:BoughtDrinks.remove(0); 所以在下一次迭代中列表可能是空的。
  • @Turing85 感谢您的建议,但您能告诉我更多为什么 buyDrinks.size() 的大小为 0 它不应该大于零吗?因为我正在传递带有元素的arraylist,并且我正在从arraylist中删除元素,但是如果只剩下一个元素,我将条件放在那里,它不会删除最后一个元素。

标签: java android sqlite arraylist android-sqlite


【解决方案1】:

您收到此错误是因为,如果 BoughtDrinks.size()>0 ,您的代码在 0 处删除项目,然后 for 循环在 0 处获取项目。因此,当您在删除所有项目后尝试在 0 处获取项目时,您将获取 indexIndexOutOfBoundsException.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();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多