Help us understand the problem. What is going on with this article?

Android Architecture Componentsメモ

More than 1 year has passed since last update.

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

oya-t
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away