でシングルトンとしてRoom
を使用するのに苦労しています。私はコトリンを使用します。SyncAdapterのシングルトンルームデータベースでLiveDataをトリガーする
私の部屋クラス
@Database(entities = [(Product::class)], version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
abstract fun productDao(): ProductDao
companion object {
@Volatile private var INSTANCE: AppDatabase? = null
fun getInstance(context: Context) : AppDatabase =
INSTANCE ?: synchronized(this) {
INSTANCE ?: buildDatabase(context.applicationContext)
.also {INSTANCE = it}
}
private fun buildDatabase(context: Context) =
Room
.databaseBuilder(context.applicationContext,
AppDatabase::class.java, "database.db")
.allowMainThreadQueries()
.build()
}
}
私はこの
val db = AppDatabase.getInstance(applicationContext)
のようなデータベースインスタンスを取得し、私の問題は、私はいつも私の活動にAppDatabase
とSyncAdapter
の2つの異なるインスタンスを取得することです。アクティビティAppDatabase
の中で実際にはシングルトン[email protected]
であり、各onPerformSync()についてAppDatabase
はシングルトンすぎる[email protected]
です。 しかし、あなたが見ることができるように、それらは2つの異なるオブジェクトです。 誰かが私がここでミスを説明することはできますか?
一方、私は達成しようとしていることで概念的に間違っているかもしれません。その後、アドバイスをいただければ幸いです。
新しいデータがリモートサーバーからSynAdapter
経由で挿入されたときに、UIコンポーネントを更新することがポイントです。LiveData
を使用します。この場合、私はそれ以外の場合はトリガされません、新しい製品を挿入するにLiveDataをトリガするためにViewModel/Activity
にし、SyncAdapter
に同じproductDao
オブジェクトを使用する必要があります。 したがって、同じものを得るためには、productDao
と同じ(すなわち、シングルトン)を取得する必要がありますAppDatabase
。
私は、これは新しいデータを挿入する時に自動的にトリガされContentProvider
を用いて実現することができることを知っています。しかし、私は本当に新しいandroidアーキテクチャのコンポーネントを試してみたい。 このユースケースを実装する唯一の正しい方法は、ContentProvider
ですか?
あなたの 'SyncAdapter'はMainThreadと同じプロセスですか? (これはマニフェストで定義するものです) – MatPag
いいえ、私のSyncAdapterはandroid:process = ":sync"を使用します。 シングルトンはプロセス間で共有されません。 – akamuza
はい、それは「唯一の」問題かもしれません。 'process'行を削除して結果をここに戻してみましょう。 – MatPag