質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

1回答

6731閲覧

エラー : java.lang.IllegalStateException: attempt to re-open an already-closed object

Velonica

総合スコア35

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/08/10 05:14

###前提・実現したいこと
資材管理のアプリを作っています。
その中で、発注数を、データベース内の在庫数やしよう数などを用いて自動で求めるクラスを作成しています。

###発生している問題・エラーメッセージ

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

是非、ご教授ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

一度クローズしたSQLiteDatabaseのインスタンスに対して、再度SQLを実行すると発生する例外です。

引数で渡されているSQLiteDatabaseのインスタンスを再利用していませんか?

投稿2016/08/10 05:22

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問