0

sqliteデータベースを備えたアプリがあります。

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

アプリにアクティビティ、サービス、アプリウィジェットがあります。

データベースが必要な場合は、クラスのオブジェクトを作成し、開いて、処理を行い、最後に閉じます。

たとえば、アクティビティでは、onStartでdbを開き、onStopで閉じます。

appwidgetを除いて、すべてがうまく機能します。

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

しかし、appwidgetからUPDATEを実行しようとすると、「データベースDATABASE_FLEはすでに閉じられています」というエラーが発生します。

それは何でしょうか?

私はdbを閉じているところにいくつかのログを追加しました、そしてそれらの行のどれもこのエラーの前に実行されません..dbは大丈夫なはずです。

何か案は?

ありがとう。

4

2 に答える 2

0

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

現在、アクティビティが閉じられているため、データベースが閉じられています。Appwidget は DB を更新しようとしますが、既に閉じられています。

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

于 2012-04-09T15:57:28.253 に答える
0

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

私はこのようなものを持っていました:

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

   mStatement.execute();

これに関する問題は、関数呼び出しで db オブジェクトが変更され、ステートメントをコンパイルした最初の db オブジェクトが既に閉じられていることです。

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

于 2012-04-09T18:18:52.037 に答える