見出し画像

【アプリ開発日記10日目📘】簡単なAndroidアプリのデータベース実装について

こんにちは、チョコです。

noteを継続するのって難しいですね。😅

0日目の次が10日目になってしまうとは…🙈💦
(日は空いてしまいますが、ゆるりと続けていく所存なので、よろしくお願いします。(^^^;;) )

さて前回の記事では、開発するアプリについてを主に書いていて、進捗としてはUIの大枠ができたところだったかなと思います。

あれから、noteは更新できていませんでしたが、

休日に開発をちびちび進めています。

具体的には、UIにアニメーション追加して動きを付けたり、機能を追加したり、データベースの実装を行って、データベースに保存しているデータをUIに反映させるところなどが進みました。

今回のnoteでは、Androidのローカルデータベースの実装について、ざっと書いてみようと思います。

Roomを用いたデータベースの実装

Android OSには、「SQLite」というRDBMSが搭載されているので、Androidでのローカルデータベースの実装といえば、SQLiteOpenHelperを継承したHelperクラスを作って…...という方法があります。

少し前までは、この方法が一般的だったんですが、


Roomライブラリ というSQLiteをラップして利用できるコンポーネントが登場してからはローカルデータベースの実装はRoomを使用することが一般的になっています。

Android Developerの公式ドキュメントでも

"SQLite の代わりに Room を使用することを強くおすすめします。"

と、書かれているので、今後Androidアプリ開発で、データベースを実装する際は、Roomを使用していきましょう。👌

Roomの実装の流れも書いておきます。

Roomの実装では、3つのファイルを用意するだけで、データベースを実装できます。

実装の流れ。

まず、Database内のテーブルを示すエンティティをdataクラスで用意します。@Entity(tableName = "record")と書いている所で、recordという名のテーブルを定義しています。また、@PrimaryKeyといったアノテーションを使ってPrimaryKey などを指定したりできます。

@Entity(tableName = "record")
@TypeConverters(DateTimeConverter::class)
data class Record constructor(
   @PrimaryKey(autoGenerate = true) // 必ず主キーをつける必要がある
   val id: Int,
   val calendar: String,
   val condition: Int,
   val memo: String,
   val food: String
)

次に、DAOをinterfaceで用意し、データベースにアクセスする際に使用するメソッド(insert, update, deleteなど)を書きます。

コメントにも書いていますが、onConflict = OnConflictStrategy.REPLACEと書いておくと、コンフリクトが起こった時は上書きして置き換えるといった指定もここでできます。

@Dao
interface RecordDao {
   @Query("SELECT * from record") // 全件取得のSQL。この時にソートや抽出などもできる。
   fun getAllRecordData(): LiveData<List<Record>>

   @Insert(onConflict = OnConflictStrategy.REPLACE) // コンフリクトが起こった時は置き換える
   suspend fun insert(record: Record)

   @Update
   fun update(record: Record)

   @Delete
   fun delete(record: Record)
}

クエリーも@Queryアノテーションの()で書けるので、

各メソッドがDBとどんなやり取りをするメソッドなのかが見て非常にわかりやすいです!👏😊

そして最後に、RoomDatabase() を継承したDatabaseクラスを書きます。このクラスの先頭で先ほど作成したエンティティ(Record)を指定してあげています。

@Database(entities = [Record::class], version = 1)
abstract class RecordRoomDataBase: RoomDatabase() {
   abstract fun recordDao(): RecordDao
   companion object {
       @Volatile
       private var INSTANCE: RecordRoomDataBase? = null
   }
}

以上の3つのファイルを作成した後は、次のコードを使用して、作成したデータベースのインスタンスを取得し、データベースに変更を加えることが可能です。

val db: RecordRoomDataBase = Room.databaseBuilder(
       context,
       RecordRoomDataBase::class.java, "record-database"
   ).build()
val dao = db.recordDao()

dao.insert(record)

SQLiteOpenHelperを継承してHelperクラスを作って...という方法の場合では、どうしてもゴリゴリ書かなければならない所がRoomを使用するとすっきり書ける印象ですね◎

今まで書かなければいけなかった処理を省略できて、とても簡潔にデータベースを実装できる所がRoomを使うメリットなんだな~。とよくわかりました。

ただしかし。

Roomの利点はそれだけじゃなかったです。

Roomを使用することで受けられる重要な恩恵としては、DaoでこのようにLiveDataを戻り値に設定することができる所です✨

fun getAllRecordData(): LiveData<List<Record>>

LiveDataを戻り値に設定することができるため、データベースのデータに変更が加わった際に自動的にUIに通知が届きます!\(◎o◎)/♡

データベースの更新と同時にUIへの反映が可能なので、データベースの内容が変わることによってUIも変更させたいケースの実装にはとても便利です。

Roomを実装する際にはLiveDataをぜひ活用していきましょう。

また、こちらにRoomを使用したアプリのアーキテクチャガイドも載っています。とても参考になりました。

おわりに

以上、今回はAndroidアプリを開発でのローカルデータベースの実装について書いてみました。✍️

Room使ってみたいけど使ったことないな~という方は手間もかからずすぐできるので、ぜひお試しください。

この記事が気に入ったらサポートをしてみませんか?