当我将 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();
}
我是 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();
}