[Android] Room + LiveDataでデータベースの変更通知を受け取る

データベースのテーブルの状態が変わったら変更通知受けてViewを更新したいよ!

って感じで調べたやつ。

びっくりするくらい簡単だった・・・。

LiveDataは有能すぎですね!

Roomについてはこの記事で!

スポンサーリンク

実装

依存

    // Coroutines
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.1"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.1"

    // Room
    def room_version = "2.2.2"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    implementation "androidx.room:room-ktx:$room_version"

Daoクラス

// Dao
@Dao
interface HogeEntityDao {

    @Query("select * from HogeEntity order by datetime desc")
    fun getAll(): LiveData<List<HogeEntity>>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(hogeEntity: HogeEntity)

    @Query("delete from HogeEntity")
    fun deleteAll()

}

Selectするメソッドの戻り値をLiveDataにするだけ!

これでLiveData君がよしなに通知をしてくれる。お手軽!

ViewModel

// ViewModel
class MainViewModel : ViewModel() {

    val hogeLiveData = App.db.hogeEntityDao().getAll()

    fun insert(hogeEntity: HogeEntity) {
        GlobalScope.async(Dispatchers.Default) {
            App.db.hogeEntityDao().insert(hogeEntity)
        }
    }
}

ViewModelでフィールド変数でLiveDataを入れておく。

このhogeLiveDataを使いたいところでObserveしてあげる感じ。

データを加工したいんだったらViewModelでやっちゃうのが良いよね。

使ってみる

class MainFragment : Fragment() {

    companion object {
        fun newInstance() = MainFragment()
    }

    private lateinit var viewModel: MainViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        return inflater.inflate(R.layout.main_fragment, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java).apply {
          
            hogeLiveData.observe(this@MainFragment, Observer {
                message.text = it.map { it.hoge }.toString()
            })

            var count = 0
            message.setOnClickListener {
                count++
                insert(HogeEntity("hoge$count"))
            }
        }
    }
}

画面をタップするたびにhogeが増殖していくっていう感じ(ぇ

タイトルとURLをコピーしました