Roomの利用方法
これで三種の神器が揃ったとはいえ、最後のAppDatabaseに本来記述しなくてよいコードが多々あります。この種明かしは、アクティビティやフラグメントからRoomを利用する方法と関連があります。そのため、最後にRoomの利用方法を紹介するとともに、AppDatabase内のコードの種明かしを行います。
Room利用の基本コードパターン
アクティビティなどでRoomを利用する場合、まず、リスト7やリスト8で作成したRoom Database(AppDatabaseクラス)のインスタンスを取得します。しかし、AppDatabaseクラスをnewするのではありません。何より、AppDatabaseクラスは抽象クラスですので、newできません。これは、リスト9の(1)やリスト10の(1)のコードを記述します。RoomクラスのstaticメソッドであるdatabaseBuilder()メソッドを実行後に、build()メソッドを実行します。databaseBuilder()メソッドには、第1引数としてアプリケーションコンテキスト、第2引数として生成するRoom Databaseクラス、第3引数としてデータベースファイル名を渡します。
その後、(2)のコードによりDAOインスタンスを取得して、(3)のようにDAOメソッドを実行します。
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "cocktailmemo_db").build(); // (1) CocktailmemoDAO cocktailmemoDAO = db.createCocktailmemoDAO(); // (2) ListenableFuture<Cocktailmemo> future = cocktailmemoDAO.findByPK(cocktailId); // (3) :
val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "cocktailmemo_db").build() // (1) val cocktailmemoDAO = db.createCocktailmemoDAO() // (2) lifecycleScope.launch { val cocktailmemo = cocktailmemoDAO.findByPK(cocktailId) // (3) : }
Room Databaseにはシングルトンパターンを適用する
ここで問題となるのは、(1)のコードです。このRoom Databaseインスタンスの生成処理というのは、非常にリソースを必要とする処理であるため、生成したインスタンスをアプリ内で再利用する仕組みが必要となります。そのため、Androidの公式ドキュメントでは、シングルトンパターンを適用することを勧めています。リスト9やリスト10のAppDatabaseクラスの抽象メソッド以外のコードというのは、まさにこのシングルトンパターンのためのコードであり、そのため、リスト9の(1)やリスト10の(1)のAppDatabaseインスタンスの生成コードが、Javaコードであるリスト7では(3)に、Kotlinコードであるリスト8では(1)のインスタンスが存在しない場合に実行されるようになっています。
このように定義したAppDatabaseを利用する場合は、アクティビティなどでは、getDatabase()を実行して、そのインスタンスを取得することになります。
まとめ
Android Jetpackについて紹介していく本連載の第2回は、いかがでしたでしょうか。
今回は、データベース処理を自動化してくれるライブラリであるRoomを紹介しました。Roomを利用することで、最小限のコードで、非同期処理も含めて複雑なデータベース処理を手軽に利用できるようになります。
次回は、このRoomをViewModelと組み合わせて利用する方法を紹介します。