データベースのテーブルの状態が変わったら変更通知受けて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が増殖していくっていう感じ(ぇ