에 싱글 톤으로 Room
을 사용하는 데 어려움을 겪고 있습니다. 나는 코 틀린을 사용한다.SyncData의 Singleton Room 데이터베이스가 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)
같은 데이터베이스 인스턴스를 검색 그리고 내 문제는 내가 항상 내 활동과 SyncAdapter
에 AppDatabase
의 두 개의 서로 다른 인스턴스를 얻을 수 있다는 것입니다. 액티비티 중 AppDatabase
이 실제로 싱글 톤 [email protected]
이고 각 onPerformSync()에 대해 AppDatabase
도 싱글 톤이 [email protected]
입니다. 그러나 보시다시피 두 개의 다른 개체입니다. 아무도 내가 여기에서 놓친 것을 설명 할 수 있습니까?
반면에 내가 어쩌면 내가 개념적으로 달성하려고 시도하는 것이 잘못되었습니다. 그럼 모든 조언을 주시면 감사하겠습니다.
요점은 SynAdapter
을 통해 원격 서버에서 새 데이터를 삽입 할 때 LiveData
을 사용하여 UI 구성 요소를 업데이트하는 것입니다. 이 경우 새 제품을 삽입 할 때 LiveData를 트리거하기 위해 동일한 productDao
개체를 ViewModel/Activity
및 SyncAdapter
에 사용해야합니다. 그렇지 않으면 트리거되지 않습니다. 따라서 동일한 것을 얻으려면 productDao
동일해야합니다 (즉, 싱글 톤) AppDatabase
.
이것은 새로운 데이터 삽입시 자동으로 실행되는 ContentProvider
을 사용하여 구현할 수 있음을 알고 있습니다. 하지만 실제로 새로운 안드로이드 아키텍처 구성 요소를 사용해보고 싶습니다. ContentProvider
을 사용하는 것이이 유스 케이스를 구현하는 유일한 올바른 방법일까요?
'SyncAdapter'는 MainThread와 동일한 프로세스입니까? (이것은 매니페스트에서 정의한 것입니다.) – MatPag
아니요, 내 SyncAdapter는 android : process = ": sync"를 사용합니다. 내가 무슨 뜻인지 알 것 같네. 싱글 톤은 프로세스간에 공유되지 않습니까? – akamuza
예, "유일한"문제 일 수 있습니다. 'process' 라인을 제거하고 결과를 여기에 게시 해 봅시다. – MatPag