Как вставить несколько строк в базу данных SQL - PullRequest
0 голосов
/ 27 марта 2019

Я занимаюсь разработкой книги рецептов, и у меня проблема с сохранением нескольких ингредиентов для одного рецепта в базе данных.Я могу добавить, нажав кнопку, умножить линейный макет с внутри ингредиента EditText и количество EditText.Таким образом, цикл for оценивает каждый макет, он принимает значения тока ингредиента и количества, сохраняя их в экземпляре newIngredient (из класса Ingredient.class).Затем он вставляет экземпляр в базу данных и, наконец, добавляет этот экземпляр в мой ArrayList «ингредиенты» и закрывает БД.С отладкой я обнаружил, что все это работает только для первой итерации цикла.

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 Ответ

1 голос
/ 27 марта 2019

В вашем коде вы закрываете базу данных внутри цикла for.

По этой причине ваш код выполнит первую итерацию, затем закроет базу данных, и поэтому следующие итерации завершатся неудачно из-за закрытое соединение с БД .

Вы должны переместить ваш dbHeloper.close(); вызов за пределы цикла.

В зависимости, вы можете переместить свою переменную за пределы цикла 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();

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

...