モケラ

Tech Sheets

mokelab

Roomを使ってデータベースアクセスしてみる

最終更新日:2020-07-10

EntityDAODatabaseができたら、準備は完了です。最後にデータベース操作を実装しましょう。

まず、 DatabaseDAO 置き場となるViewModelを作りましょう。Databaseを作る際に ApplicationContext が必要となるので、 AndroidViewModel を継承させておきます。

class MyViewModel(application: Application):
        AndroidViewModel(application) {
    val db = Room.databaseBuilder(application, ArticleDB::class.java, "article-db").build()
    val dao = db.articleDAO()
}

_RoomDatabase を作るには、 Room.databaseBuilder().build() を使います。第2引数には定義した RoomDatabase クラスを指定し、第3引数にはデータベースファイル名を指定します。

次に、このViewModelを Fragment で取得しましょう。RoomDatabase オブジェクトはアプリで複数生成すべきではないので、 Activity に紐づけたViewModelで取得します。

class MyFragment: Fragment(R.layout.fragment_my) {
    private val viewModel: MyViewModel by activityViewModels()
}

データの追加はDAOで定義したメソッドを呼ぶだけです。UIスレッドで呼ぶと例外が発生するので、ワーカースレッドで実行されるようにします。ViewModelにあるviewModelScope を使うとよいでしょう。

class MyViewModel(application: Application):
        AndroidViewModel(application) {
    fun insert() {
        viewModelScope.launch {
            withContext(Dispatchers.IO) {
                val title = "記事タイトル"
                val content = "記事本文"
                val article = Article(0, title, content)
                viewModel.dao.insert(article)
            }
        }
    }
}

データの取得もDAOで定義したメソッドを呼ぶだけです。 LiveData を返す場合は observe しておくと、自動で最新のデータが取得できます。

// this is Fragment
this.viewModel.dao.getAll().observe(viewLifecycleOwner, Observer {
    adapter.submitList(it)
    adapter.notifyDataSetChanged()
})

一覧に戻る