0

短いバージョン:アクティビティと開始されたサービスの両方から同じDBにアクセスするためのベストプラクティスの方法は何ですか?

ロングバージョン:アクティビティから永続的なサービスを開始する場合があります。アクティビティが画面にデータを表示している間、サービスはDBにデータを入力しています。どちらも常に実行されているわけではありません。サービスはアクティビティがないときに実行でき、アクティビティはサービスがまだ開始されていないときに実行できます。ただし、サービスはアクティビティからのみ停止できます(それ自体が停止することはありません)。

SQLiteOpenHelperのサブクラスを使用してDBにアクセスしています。私がつまずいた問題は、あるインスタンスでDBを閉じると、別のインスタンスでもDBがSQLiteOpenHelper閉じられるように見えることです。

私はこれらのオプションを考えることができます:

  1. シングルトンパターン(パブリック静的変数内の単一SQLiteDatabaseインスタンス-アクティビティのみがそれを閉じることができます(サービスが実行されているかどうかを認識しているため))-醜い
  2. 他のサービス/アクティビティを閉じる前に、サービス/アクティビティが実行されているかどうかを確認してください-醜い
  3. 取得/リリースをSQLiteOpenHelperのgetReadableDatabase()/にビルドしますclose()

3.を使用しますが、これは非常に一般的なパターンである必要があるため、このような組み込みのメカニズムがすでに存在するかどうか疑問に思います。車輪の再発明はしたくありません。

言い換えれば、それを行うための適切な方法は何でしょうか?

4

2 に答える 2

1

Android 上のデータベースの通常のパラダイムは、1 つのプロバイダーがデータベースを開き、リクエストをインテントとして処理することです。これには、リクエストをシリアル化するという利点があります。

異なるコードからデータベースを開くことは、まったく標準的ではありません。

何かが追加されるたびにアプリが通知する必要がある場合は、プロバイダーからのブロードキャスト インテントが答えになる可能性があります。

于 2012-05-30T16:52:17.323 に答える
0

保持/解放カウンターを使用して問題を解決しました:

public class DBHandler extends SQLiteOpenHelper
{
    private static int retainCount = 0;

    @Override
    public synchronized SQLiteDatabase getReadableDatabase()
    {
        DBHandler.retainCount++;
        return super.getReadableDatabase();
    }
    @Override
    public synchronized SQLiteDatabase getWritableDatabase()
    {
        DBHandler.retainCount++;
        return super.getWritableDatabase();
    }
    @Override
    public synchronized void close()
    {
        DBHandler.retainCount--;
        if (DBHandler.retainCount == 0)
            super.close();
        }
    }
}
于 2012-05-31T19:46:03.223 に答える