2012-04-09 4 views
0

私はsqliteデータベースを持つアプリを持っています。アンドロイドのsqliteデータベースが既に閉じたエラー

SqliteDatabaseのインスタンスを保持する独自のデータベースクラスを作成しました。クラスは私のクエリ、オープン、クローズなどを実装しています(クラスはシングルトンではありません)。

私は自分のアプリにアクティビティ、サービス、およびアプリウィジェットを持っています。

私はデータベースが必要ですが、私は自分のクラスのオブジェクトを作成し、オープンして、最後にやります。

たとえば、アクティビティでは、データベースをonStartで開き、onStopを閉じます。

すべてはappwidgetを除いて素晴らしいです。

私がappwidget onUpdateでデータを選択する必要がある場合、それは問題ありません。

私はappwidgetからUPDATEを実行しようとすると、 "database DATABASE_FLE already closeed"エラーが発生します。

何ができますか?

私はデータベースを閉じているいくつかのログを追加しましたが、このエラーの前にこれらの行は実行されません。

アイデア?

ありがとうございました。

答えて

0

問題は、私がSQLiteStatmentオブジェクトをコンパイルして、将来の使用のために保存して、データベースオブジェクトが置き換えられたためです。 SQLiteStatementを再度コンパイルする必要があるためです。

私はこのような何かを持っていた:

public void func(SQLiteDatabase db) { 
    if (mStatement == null) 
     mStatement = db.compileStatement(SQL); 

    mStatement.execute(); 

これに伴う問題は、DBオブジェクトは、関数呼び出しで変更され、コンパイルされた文がすでに閉鎖された最初のDBオブジェクトということです。

解決策は、if-nullを削除し、すべてのdbオブジェクトのステートメントをコンパイルすることでした。

+0

私は他の開発者がそれから学ぶことができるので、問題に解決策を投稿することは非常に重要です。 – Jviaches

0

私が考えているのは、アンドロイドがあなたのアクティビティを閉じる/アンロードする場合です(これは、デバイスに少しのメモリが残っている場合などに起こります)が、この時点ではあなたのappwidgetはまだアクティブです。

あなたの活動が閉じられているため、あなたはdbが閉じられています。 AppwidgetはDBを更新しようとしますが、DBはすでに閉じられています。

このシナリオを確認してください。とにかく、このシナリオを考慮する必要があります。 :)

+0

appwidget onUpdateで、私は新しいデータベースオブジェクトを作成し、データベースを開きます。SELECTが動作します。私は更新しようとするとエラーが発生します(実際にはSQLステートメントオブジェクトのバインドを呼び出すとき) – Ran

関連する問題