###前提・実現したいこと
資材管理のアプリを作っています。
その中で、発注数を、データベース内の在庫数やしよう数などを用いて自動で求めるクラスを作成しています。
###発生している問題・エラーメッセージ
java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.example.macuser.havi2/databases/HAVI.db
CalclationOrderクラス内のgetInNumberメソッドにおいて、上記のエラーが発生。
###該当のソースコード
public class CalculationOrder { private int monthDate; private boolean judgement = false; private Map<String, Double> UsedNumberMap; private List<String> numberList; private Map<String, List<Integer>> stockNumber; private List<Integer> stockNumberPreserve; private Map<String, List<Integer>> InNumber; private List<Integer> InNumberPreserve; private Map<String, Double> resultStock; private CalculationOrder(int month, SQLiteDatabase dbSelectMonth, SQLiteDatabase db1, SQLiteDatabase db2, SQLiteDatabase db3, SQLiteDatabase db4, SQLiteDatabase db5, SQLiteDatabase dbUpdate) { String sql = "SELECT \"month\" FROM Number WHERE \"number\" = \"014023\""; Cursor cursor = dbSelectMonth.rawQuery(sql, null); Calendar calendar = Calendar.getInstance(); int dbMonth = calendar.get(Calendar.MONTH); dbMonth++; try { while(cursor.moveToNext()) { dbMonth = cursor.getInt(cursor.getColumnIndex("month")); } } finally { dbSelectMonth.close(); } this.monthDate = dbMonth; if (this.monthDate == month) { this.judgement = false; } else if (this.monthDate != month) { this.judgement = true; this.monthDate = month; } if(judgement) { updateOrdering(db1, db2, db3, db4, db5, dbUpdate); } } public static CalculationOrder getInstance(int month, SQLiteDatabase dbSelectMonth, SQLiteDatabase db1, SQLiteDatabase db2, SQLiteDatabase db3, SQLiteDatabase db4, SQLiteDatabase db5, SQLiteDatabase dbUpdate) { return new CalculationOrder(month, dbSelectMonth, db1, db2, db3, db4, db5, dbUpdate); } private Map<String, List<Integer>> getStockNumber(SQLiteDatabase db) { stockNumber = new LinkedHashMap<>(); String sql = "SELECT \"number\", \"case\", \"bag\", \"substance\", \"month\" FROM Number;"; Cursor cursor = db.rawQuery(sql, null); try { while (cursor.moveToNext()) { stockNumberPreserve = new ArrayList<>(3); int month = cursor.getInt(cursor.getColumnIndex("month")); if (month == this.monthDate) { String number = cursor.getString(cursor.getColumnIndex("number")); int caseNumber = cursor.getInt(cursor.getColumnIndex("case")); int bagNumber = cursor.getInt(cursor.getColumnIndex("bag")); int substanceNumber = cursor.getInt(cursor.getColumnIndex("substance")); stockNumberPreserve.add(caseNumber); stockNumberPreserve.add(bagNumber); stockNumberPreserve.add(substanceNumber); stockNumber.put(number, stockNumberPreserve); } } } finally { db.close(); } return stockNumber; } private Map<String, List<Integer>> getInNumber(SQLiteDatabase db) { InNumber = new LinkedHashMap<>(); String sql = "SELECT \"number\", \"InBag\", \"InSubstance\" FROM InNumber;"; Cursor cursor = db.rawQuery(sql, null); try { while (cursor.moveToNext()) { InNumberPreserve = new ArrayList<>(2); String number = cursor.getString(cursor.getColumnIndex("number")); int InBag = cursor.getInt(cursor.getColumnIndex("InBag")); int InSubstance = cursor.getInt(cursor.getColumnIndex("InSubstance")); InNumberPreserve.add(InBag); InNumberPreserve.add(InSubstance); InNumber.put(number, InNumberPreserve); } } finally { db.close(); } return InNumber; } private Map<String, Double> getResultStock(SQLiteDatabase db1, SQLiteDatabase db2, SQLiteDatabase db3) { Map<String, List<Integer>> InNumber = getInNumber(db2); Map<String, List<Integer>> StockNumber = getStockNumber(db3); List<String> numberList = getNumberList(db1); List<Integer> ListInNumber = new ArrayList<>(); List<Integer> ListStockNumber = new ArrayList<>(); int caseNumber; int bagNumber; int substanceNumber; int InBagNumber; int InSubstanceNumber; for (String s : numberList) { for (String key : InNumber.keySet()) { if (key.equals(s)) { ListInNumber = InNumber.get(key); break; } } for (String key : StockNumber.keySet()) { if (key.equals(s)) { ListStockNumber = StockNumber.get(key); break; } } InBagNumber = ListInNumber.get(0); InSubstanceNumber = ListInNumber.get(1); caseNumber = ListStockNumber.get(0); bagNumber = ListStockNumber.get(1); substanceNumber = ListStockNumber.get(2); double result = caseNumber + ((bagNumber + (substanceNumber / InSubstanceNumber)) / InBagNumber); resultStock.put(s, result); } return resultStock; } private void updateOrdering(SQLiteDatabase db1, SQLiteDatabase db2, SQLiteDatabase db3, SQLiteDatabase db4, SQLiteDatabase db5, SQLiteDatabase dbUpdate) { Map<String, Double> resultStockNumber = getResultStock(db1, db2, db3); Map<String, Double> usedNumber = getUsedNumber(db4); List<String> listNumber = getNumberList(db5); try { for (String s : listNumber) { double usedNumberPreserve = 0.0; double stockNumberPreserve = 0.0; for (String key : resultStockNumber.keySet()) { if (key.equals(s)) { stockNumberPreserve = resultStockNumber.get(key); break; } } for (String key : usedNumber.keySet()) { if (key.equals(s)) { usedNumberPreserve = usedNumber.get(key); break; } } double usedNumberQuarter = usedNumberPreserve / 4; List<Integer> weekOfMonth = new ArrayList<>(); double preserveStockNumber = stockNumberPreserve; int i = 1; while (i < 48) { if (usedNumberQuarter * i < preserveStockNumber) { i++; weekOfMonth.add(0); } else if (usedNumberQuarter * i >= preserveStockNumber) { if (i <= 4) { weekOfMonth.add(1); preserveStockNumber = preserveStockNumber - (usedNumberQuarter * (i - 1)) + 1.0; } else { break; } } } Calendar calendar = Calendar.getInstance(); int month = calendar.get(Calendar.MONTH); month++; String sql = "UPDATE Ordering SET \"month\" = " + String.valueOf(month) + ", \"first\" = " + String.valueOf(weekOfMonth.get(0)) + ", \"second\" = " + String.valueOf(weekOfMonth.get(1)) + ", \"third\" = " + String.valueOf(weekOfMonth.get(2)) + ", \"forth\" = " + String.valueOf(weekOfMonth.get(3)) + "WHERE \"number\" = " + s + ";"; dbUpdate.execSQL(sql); } } finally { dbUpdate.close(); } } }
###試したこ
コードを読み直して、見ましたが原因がわからず、デバックをしてみましたが、原因を特定することができませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
API level 21
是非、ご教授ください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。