Posted at

Android Architecture Componentsメモ


Room


データの変更があっても、通知されない(Room + Dagger2)

以下のようにDaoでデータを取得するメソッドの戻り値をLiveDataにすると、その後データに変更があった場合に通知してくれる。


MailDao.kt

@Dao

interface MailDao {

@Query("SELECT * FROM mail")
fun loadMail(): LiveData<List<Mail>>

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertMails(mails: List<Mail>)

@Query("DELETE FROM mail")
fun clearTable()
}



MailViewModel.kt

var mailList: LiveData<List<Mail>> = mailDao.loadMails()



InboxFragment.kt

mailViewModel.mailList.observe(this, Observer { mailList ->

if (mailList == null) {
return@Observer
}

adapter?.setMailList(mailList.toMutableList())
})


しかし、データの追加・変更をしても通知が来ない。

原因はDaggerでインスタンスを生成するときにシングルトンにしてなかったから。

@Singletonを追加して無事変更の通知が来ました。


AppModule.kt

    @Singleton  // ★追加

@Provides
fun provideMailDatabase(app: Application): MailDatabase = Room.databaseBuilder(app, MailDatabase::class.java, "mail").allowMainThreadQueries().build()

@Singleton // ★追加
@Provides
fun provideMailDao(database: MailDatabase) = database.mailDao()


参考:Room - LiveData observer does not trigger when database is updated