2016-12-30 9 views
-2

私は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); 
} 

?どんな助けでも大歓迎です。あなたが参照して、データベース接続を閉じる必要はありません

+3

よろしくお願いします。 –

+1

なぜdb.recreateDatabases()を呼び出しますか? ? –

+0

ちょうどそれをやって、テーブルを落として再作成するという簡単な方法です。しかし、このメソッドを呼び出すか、このクラスを使用する他のメソッドを呼び出すかによって、エラーが発生します。 –

答えて

0

Best place to close database connection

あなたは、このようなオープンデータベースを残すことができます:

public class YourDatabase extends SQLiteOpenHelper { 

    public static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_NAME = "yourdatabase.db"; 
    private SQLiteDatabase database; 

    public YourDatabase(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // call this function once 
    public void open() throws SQLException { 
     database = this.getWritableDatabase(); 
    } 

    private void create(SQLiteDatabase database) { 
     database.execSQL("CREATE TABLE contacts (TEXT `name`, TEXT `number`)"); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase database) { 
     create(database); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
    } 
} 

一度だけopen()を呼び出して、あなたがすることができます属性を使用して、このようにデータベースに書き込みまたは読み取りを行います。database.rawQuery(selectQuery, null);

+0

ありがとうございました!私は嘘つきではない、私はすべての近い言葉を削除することを期待していなかったが、実際にはうまくいった! –

+0

:)それはあなたを助けてうれしい! –

関連する問題