android - 如何在 SQL 数据库中插入多行
问题描述
我正在开发一本食谱书,但在为数据库中的同一食谱保存多个成分时遇到问题。我可以添加,按下一个按钮,在一个成分 EditText 和一个数量 EditText 内添加多个线性布局。因此,for 循环评估每个布局,它采用当前的成分和数量值将它们保存在 newIngredient 实例(Ingredient.class)中。然后它将实例插入数据库,最后,将实例添加到我的“成分”ArrayList 并关闭数据库。通过调试,我发现所有这些仅适用于 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();
}
解决方案
在您的代码中,您正在关闭for
循环内的数据库。
出于这个原因,您的代码将执行第一次迭代,然后关闭数据库,因此下一次迭代将由于关闭的数据库连接而失败。
您应该将dbHeloper.close();
呼叫移到循环之外。
另外,您可以将变量移到 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);
}
//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();
希望这可以帮助!
推荐阅读
- macos - 尝试使用我的 m1 mac 运行我的 Flutter 应用程序时出错
- javascript - 进入查找复选框的 .each 函数时遇到问题
- matlab - 使用 OpenMP 在 Matlab 的 Mex 函数(Fortran)中并行化循环
- mysql - Sql Query从另一个表中获取包含多个ID的项目
- c++ - C++ 我试图结束这个无限循环以找到 0 和用户输入值之间的偶数
- csv - Jitterbit:虽然选中了“不创建 emtpy 文件”,但仅使用标题创建目标 CSV 文件
- python - Mac pip install pyodbc 失败,找不到 -lodbc 的库
- uwp - PointerReleased 在 UWP 控制之外不起作用
- r - ggplot:直方图中的 xlim 和 scale_x_continuous
- c++ - 如何向量::emplace_back 具有shared_mutex 的类?