1

デバイスがインターネットに接続されているときに実行されるサービスがあります。sqlite からデータを取得し、サーバーにアップロードします。リストフラグメントには、データベースからのデータが取り込まれています。

サービスがあるので、「データベースは既に閉じられています」「データベースが開かれていません」などのエラーが表示されます。私の dbHelper オブジェクトは静的です。SQLiteDatabase db = this.getWritableDatabase();データベースにアクセスする各メソッドの開始時に呼び出しています。そして、各メソッドの最後に db.close() 。

db.close()のみを閉じる必要がありonDestroy()ますか? ...これで問題は解決しますか、それとも別の方法がありますか?

4

2 に答える 2

1

まず、データベースを閉じたい場合は、それがisOpen().

さて、一般に、SQLiteOpenHelper実装はシングルトンであり、close()メソッドを次のようにオーバーライドする必要があります。

@Override
public synchronized void close() {
    mOpenConnections--;
    if (mOpenConnections == 0) {
        super.close();
    }

}

wheremOpenConnectionsは、 を介して確立された接続の数を保持するメンバーですSQLiteOpenHelper。このメンバーは、誰かがデータベースを開くたびにインクリメントする必要があります。

@Override
public synchronized void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    // increment the number of users of the database connection.
    mOpenConnections++;
}

次に、データベースを閉じる必要があるときにSQLiteOpenHelper.close()メソッドを使用します。

これですべての問題が解決するはずです。

于 2013-01-20T09:43:45.397 に答える
0

複数のアクティビティで確実に機能する唯一の解決策は、すべてのアクティビティの onCreate メソッドで getWritableDatabase を呼び出すことです。

指摘されているように、サービスには独自の SQLiteOpenHelper インスタンスが必要です。サービスは別のアドレス空間で実行されるため、とにかくこれが発生すると思いますが、確認することをお勧めします.

于 2013-01-18T10:04:12.217 に答える