私はSQLiteOpenHelperを使用していますが、クラスは正常に動作していましたが、カーソルからgetCount()を取得した後にデータベースを閉じなかったメソッドでエラーが発生しました。今、私はアプリを起動するたびに、私はエラーを取得する:AndroidのSQLiteエラーデータベースを開く
java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase:
私はいつもこのエラーが出るので、私はその接続をクローズしようとしているが、私は、そのクラスを持つ任意のメソッドを実行することができませんでしだ。
私は実際に新しいAndroidアプリ全体を再作成し、ソースファイルを1つずつコピーしましたが、それでも同じエラーが発生しました。
私MainActivity.javaで:私のDatabaseHelper.javaで
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BillDatabaseHelper db = new BillDatabaseHelper(this);
db.recreateDatabases(); // this is the line that causes the error
viewPagerFragment = new ViewPagerFragment();
transaction = manager.beginTransaction();
transaction.add(R.id.placeholderMain, viewPagerFragment);
transaction.commit();
}
:私はこの接続を閉じるべきである
public void recreateDatabases() {
SQLiteDatabase db = this.getWritableDatabase();
onCreate(db);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_TRANSACTIONS);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_BILL_INFO);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_REMINDERS);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_BILL_DATE_INFO);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_PAYDATES);
String strCreateTransactionsTableSQL =
"CREATE TABLE " + TABLE_TRANSACTIONS + "("
+ KEY_TRAN_ID + " INTEGER PRIMARY KEY,"
+ KEY_TRAN_DESC + " TEXT,"
+ KEY_TRAN_AMOUNT + " REAL,"
+ KEY_TRAN_PURCHASE_DATE + " TEXT);";
String strCreateBillInfoTableSQL =
"CREATE TABLE " + TABLE_BILL_INFO + "("
+ KEY_BILL_ID + " INTEGER PRIMARY KEY,"
+ KEY_BILL_NAME + " TEXT,"
+ KEY_BILL_BALANCE + " FLOAT,"
+ KEY_BILL_DUE_DATE + " TEXT,"
+ KEY_BILL_MINIMUM + " FLOAT,"
+ KEY_BILL_CURRENT + " FLOAT);";
String strCreateRemindersTableSQL =
"CREATE TABLE " + TABLE_REMINDERS + "("
+ KEY_REM_ID + " INTEGER PRIMARY KEY,"
+ KEY_REM_NAME + " TEXT,"
+ KEY_REM_DESC + " TEXT,"
+ KEY_REM_LOCATION + " TEXT,"
+ KEY_REM_START + " TEXT);";
String strCreateBillDateTableSQL =
"CREATE TABLE " + TABLE_BILL_DATE_INFO + "("
+ KEY_BILLDATE_PK + " INTEGER PRIMARY KEY,"
+ KEY_BILLDATE_TOBILL_ID + " INTEGER,"
+ KEY_BILLDATE_BILLID + " INTEGER,"
+ KEY_BILLDATE_PAYDATE + " TEXT,"
+ KEY_BILLDATE_BILLDATE + " TEXT,"
+ KEY_BILLDATE_OWEDTODAY + " CHARACTER(1),"
+ KEY_BILLDATE_BALANCE + " FLOAT,"
+ KEY_BILLDATE_CURRENT + " FLOAT,"
+ "FOREIGN KEY(" + KEY_BILLDATE_PK + ") REFERENCES " + TABLE_BILL_INFO + "(" + KEY_BILL_ID + "));";
String strCreatePaydatesSQL =
"CREATE TABLE " + TABLE_PAYDATES + "("
+ KEY_PAYDATE_ID + " INTEGER PRIMARY KEY,"
+ KEY_PAYDATE_DATE + " TEXT);";
db.execSQL(strCreateTransactionsTableSQL);
db.execSQL(strCreateBillInfoTableSQL);
db.execSQL(strCreateRemindersTableSQL);
db.execSQL(strCreateBillDateTableSQL);
db.execSQL(strCreatePaydatesSQL);
}
?どんな助けでも大歓迎です。あなたが参照して、データベース接続を閉じる必要はありません
よろしくお願いします。 –
なぜdb.recreateDatabases()を呼び出しますか? ? –
ちょうどそれをやって、テーブルを落として再作成するという簡単な方法です。しかし、このメソッドを呼び出すか、このクラスを使用する他のメソッドを呼び出すかによって、エラーが発生します。 –