#android #sql #database #class #arraylist
#Android #sql #База данных #класс #arraylist
Вопрос:
Я разрабатываю книгу рецептов, и у меня возникла проблема с сохранением нескольких ингредиентов для одного и того же рецепта в базе данных. Я могу добавить, нажав кнопку, кратную линейную компоновку с текстом редактирования ингредиентов внутри и текстом редактирования количества. Таким образом, цикл for оценивает каждый макет, он принимает текущие значения ингредиентов и количества, сохраняя их в экземпляре newIngredient (из Ingredient.class ). Затем он вставляет экземпляр в базу данных и, наконец, добавляет экземпляр в мой ArrayList «ingredients» и закрывает базу данных. При отладке я обнаружил, что все это работает только для первой итерации цикла for.
for (int d=0; d<countIngredients; d ) {
View childViewIng = parentIngredientLayout.getChildAt(d);
EditText childTextViewI = childViewIng.findViewById(R.id.ingredientsField);
EditText childTextViewQ = childViewIng.findViewById(R.id.quantityField);
childIngredient = childTextViewI.getText().toString();
childQuantity = Integer.parseInt(childTextViewQ.getText().toString());
newIngredient = new Ingredient(childIngredient, childQuantity);
dbHelper.insertIngredient(newIngredient);
ingredients.add(newIngredient);
dbHelper.close();
}
Комментарии:
1. попробуйте переместить
dbHelper.close();
за пределы цикла for2. Вы получаете исключение из базы данных, которая уже закрыта?
Ответ №1:
В вашем коде вы закрываете базу данных внутри for
цикла.
По этой причине ваш код выполнит первую итерацию, затем закроет базу данных, и поэтому следующие итерации завершатся неудачей из-за закрытого подключения к БД.
Вы должны переместить свой dbHeloper.close();
вызов за пределы цикла.
В addiction вы можете переместить свою переменную за пределы цикла for для лучшего использования памяти. вкратце:
Шаг 1: закройте базу данных после завершения цикла
for (int d=0; d < countIngredients; d ) {
View childViewIng = parentIngredientLayout.getChildAt(d);
EditText childTextViewI = childViewIng.findViewById(R.id.ingredientsField);
EditText childTextViewQ = childViewIng.findViewById(R.id.quantityField);
childIngredient = childTextViewI.getText().toString();
childQuantity = Integer.parseInt(childTextViewQ.getText().toString());
newIngredient = new Ingredient(childIngredient, childQuantity);
dbHelper.insertIngredient(newIngredient);
ingredients.add(newIngredient);
}
//move close method here, outside loop
dbHelper.close();
Шаг 2: оптимизация переменных
//move variables here, or wherever you want
View childViewIng = null;
EditText childTextViewI = null;
EditText childTextViewQ = null;
for (int d=0; d < countIngredients; d ) {
//in this way you will create only 1 object, and reuse it every time
childViewIng = parentIngredientLayout.getChildAt(d);
childTextViewI = childViewIng.findViewById(R.id.ingredientsField);
childTextViewQ = childViewIng.findViewById(R.id.quantityField);
childIngredient = childTextViewI.getText().toString();
childQuantity = Integer.parseInt(childTextViewQ.getText().toString());
newIngredient = new Ingredient(childIngredient, childQuantity);
dbHelper.insertIngredient(newIngredient);
ingredients.add(newIngredient);
}
dbHelper.close();
Надеюсь, это поможет!