KC Blog

Androidの永続ストレージをマスターする:KotlinとRoomデータベース実践講座

6 min read
AndroidDev#Android#Kotlin

前言

1.必要に応じて使用するRoomライブラリを導入します。

2.Roomの主なコンポーネントは以下の三つです:Entity、DAO、Database

3.クエリがUIをブロックするのを防ぐために、Roomはメインスレッドでのデータベースアクセスを許可しません。

実装

1. Entityの作成

Roomの@Entityアノテーションを使用してデータベースのテーブルを作成できます。

@PrimaryKeyアノテーションは各データセットにユニークなプライマリキーを作成します。

テーブルの列を変数として命名することもできます。例:id

また、@ColumnInfo(name = "name")を使用して列名を指定することもできます。

2. DAOの作成

Roomの@Daoアノテーションを使用して、データベース操作の方法を作成できます。

例:@Insert :テーブルに挿入できます。

@Query :カスタムSQLを実行できます。

一般的なSQLの使用方法については、公式ドキュメントを参照してください。

@Delete :データを削除します。

@Insert(onConflict = OnConflictStrategy.REPLACE) :衝突するプライマリキーがある場合、無視せずに置き換えます。

@Update: データを更新します。

3. Databaseの作成

@Databaseを使用してRoomDatabaseを作成します。

entitiesは作成するデータテーブルです。

versionは更新バージョン用です。

4.Build Database

直接以下のコードを使用して、RoomDatabaseのインスタンスを取得します。

5.実際にRoomを操作する

前に書いたDAOを使って直接操作します

その他の使い方

非同期DAOの使い方
サポートの程度
1.Room 2.1はsuspend関数をサポートし、Coroutinesを使用します

2.Room 2.2はFlowをサポートします 3.その他にもRxJava、LiveData、Guavaなどをサポートしています。興味がある方は:公式ドキュメントをご覧ください

CoroutinesでRoomを操作する方法
Flow、LiveDataでRoomを操作する方法

上記の操作インターフェースを完了した後は、通常のcoroutines、flow、LiveDataの方法で使用できます

事前にデータベース内容を作成する.dbファイル
データベースにデフォルトデータを含めたい場合、データを格納する.dbファイルを事前に保存パスに埋め込み、createFromAssetを使用して作成します

またはFileを使用して作成したい場合は、.createFromFile(File("mypath"))に変更します

タイプコンバーター
ネイティブでサポートされている変数タイプが不足している場合、カスタムしたい場合は、

@TypeConvertersを使用して

変数タイプを変換し、Roomで使用できるようにします。

例えば、RoomデータベースにDateを保存する必要がある場合、RoomはDateオブジェクトの保存方法を知りませんが、次のようにできます:

TypeConverterを作成する
DBに追加する
Roomで使用できるようになりました
Roomコードのいくつかの使用テクニック
1.tableNameをラベル形式で定義し、複数の主キーprimaryKeysをサポートする
2.Embeddedオブジェクトを作成し、data classで保存フィールドを作成する
3.データベースのリレーションを定義する
2つのテーブルがあります

特定のケースで2つのテーブルの対応するデータを取得して使用したい場合

対応する親、子エンティティを追加します。この例では、それぞれUserEntity、HistoryEntityです。

次に、@Relationを追加します。ここでは対応する一意のキー値(例えばprimaryKey)を指定します。

この例では、parentColumnはUserEntityのprimaryKeyに対応し、

entityColumnはHistoryEntityのprimaryKeyに対応します

最後にDAOに操作メソッドを追加します:

ここで@Transactionを追加することで、データの一貫性を保証できます。

データベースが複数の操作を行う場合、

例えばAテーブルを操作してからBテーブルを操作する場合、

途中でAテーブルが成功してBテーブルが失敗した場合、

返される結果が間違っている可能性があります。

したがって、@Transactionを使用することで、データの取得が全て成功するか、全て失敗するかのどちらかになり、

操作が途中で中断されることがなく、データの取得が不正確になることを防ぎます。

4.データベースのバージョン移行
- 自動更新:@Database内のversionにAutoMigration (from = 1, to = 2)を追加することで、データベースはversionに従って自動的にバージョン移行します。 - 手動更新:Migrationを使用して移行のSQLコマンドを定義します room 1 Room dbをビルドする際にMigrationを追加します。例えば: