Как вставить несколько строк в базу данных SQL

#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(); за пределы цикла for

2. Вы получаете исключение из базы данных, которая уже закрыта?

Ответ №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();
  

Надеюсь, это поможет!