モケラ

Tech Sheets

mokelab

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

最終更新日:2019-04-03

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で取得します。

private lateinit var viewModel: MyViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    this.viewModel = ViewModelProviders.of(requireActivity()).get(MyViewModel::class.java)
}

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

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(this, Observer {
    adapter.submitList(it)
    adapter.notifyDataSetChanged()
})

一覧に戻る