Androidでデータを保存するRoomを使う方法
今回は、Android開発で必須級の、データを保存する方法の一つであるRoomの実装方法を解説します。
それでは行ってみましょう。
□■□■□
開発環境:Android Studio
言語:Kotlin
データの保存方法の種類
Androidの開発で使用されるAndroid Studioですが、データを保存する方法はいくつかあります。
①DataStore(旧SharedPreferences)を使用する
②Room(SQLite)を使用する
③ストレージにファイルとして保存する
①は、音量や通知設定など、比較的小さなデータを簡単に保存する方法で、鍵となるワードとデータを一組として保存します。例として、鍵が「bgmVolume」、データが「3」といった感じです。元々はSharedPreferencesを用いていましたが、現在はDataStoreを使用することが推奨されています。
②は、Androidスマートフォン内で動いているSQLiteというデータベースにデータを保存する方法で、比較的量の多いデータを保存する時に使用します。SQLiteはリレーショナルデータベースなので、MySqlなどの一般的なデータベースと同じ形式でデータが保存されています。今回紹介するのはこちらです。
③Androidスマートフォンの内部ストレージにファイルを作成し、そこにデータを書き込んで保存します。自身でファイルの内容を管理しなくてはいけないため、少々面倒な方法ですが、①や②の方法と異なり、アプリをアンインストールしてもデータを保持し続けることが可能です。
自身の状況に合わせて、これらの方法の中から最適なものを選びましょう。
Roomの実装方法
1.必要なパッケージのインポート
Projectのbuild.gradleファイル内に以下を記述します。
implementation "androidx.room:room-ktx:2.4.3"
kapt "androidx.room:room-compiler:2.4.3"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
implementation "androidx.work:work-runtime-ktx:2.7.1"
}
バージョンの数字は、その都度最新のものに置き換えてください。もし、黄色のマーカーが付いている場合は、カーソルを合わせると最新バージョンの数字が表示されます。
2.データ保存用のクラス作成
Roomは、Classのインスタンスがそのままデータベースのレコードの用に保存されるため、保存用のクラスを作成します。例は以下です。
data class TestData(@PrimaryKey val testDataId:Int){
var name = "kesanyoshi"
var age = 100
@Ignore private val listView:View? = null
}
上記の例は、TestDataというクラス内に4つの変数があります。
まず、保存用のクラスには@Entityアノテーションを付けます。
続いて、データベースのレコードを識別するためのプライマリーキーとする変数の頭に、@PrimariKeyというアノテーションを付けます。ここでは、testDataIdがそれにあたります。また、PrimaryKeyを複数用意することもできますが、その場合は書き方が異なるため、また別の機会に紹介します。
最後に、クラス内で保存してほしくない変数の頭に@Ignoreアノテーションを付けます。例では、listViewがそれに当たります。データベースに保存できない型の変数には、全て@Ignoreを付ける必要があります。
3.Daoを作成
データベースでは、データを読み書きするために、SQL文を用いますが、RoomではDaoでそれらをあらかじめ記述しておきます。例は以下です。
interface TestDataDao{
@Query("SELECT * FROM TestData")
fun select(): List<TestData>
@Insert
fun insert(vararg data: TestData)
@Update
fun update(vararg data: TestData)
上記の例は、先程のTestDataクラス用のDaoになります。Daoはinterfaceの形を取ります。
SQL文を直に記述する場合は、@Queryアノテーションを用いて例のように記述します。例の場合、selectメソッドを呼ぶと、TestDataテーブル(クラス)をSELECTした全レコード(インスタンス)をListにしたものが帰ってきます。
代表的なSQL文は予めアノテーションが用意されているため、例を参考に各メソッドを用意しておきます。
4.データベースのテーブルとDao一覧を作成する
先程、TestDataクラスを作成しましたが、アプリを作成する場合、保存するテーブルは複数になることがほどんどです。このいくつもあるテーブルやそれぞれのDaoをRoomで一括管理するためのクラスを作成する必要があります(テーブルが一つでも必要)。例は以下です。
version = 1,
entities = [
TestData::class,
Test2Data::class,
],
exportSchema = true,
autoMigrations = []
)
abstract class AppDatabase : RoomDatabase() {
abstract fun TestDataDao():TestDataDao
abstract fun Test2DataDao():Test2DataDao
}
上記の例では、先程までに作成したTestDataクラスとTestDataDao以外に、Test2DataクラスとTest2DataDaoを追加して記述してあります。テーブルが増えた場合は、ここに追加でそのテーブルをDaoを記述します。
5.データにアクセスする
データのアクセスを行う際は、DataBaseBuilderでデータベースを作成し、その変数越しにアクセスを行います。
データベースビルダーは以下で作成できます。
.databaseBuilder(context, AppDatabase::class.java, "test_db")
.fallbackToDestructiveMigration()
.build()
DaoのSELECT文を使用する場合。
var testListTmp = db.testDataDao().select()
DaoのUPDATE文を使用する場合(testInstanceはUPDATEしたいインスタンス)。
db.friendDataDao().update(testInstance)
以上で手順は終了となります。
□■□■□
というわけで、AndroidでRoomを扱う方法を解説しました。
正直、ちゃんと動くまで複数の記事を参考にしまくり、まともに動くまで数日がかりでした。
次回は、このRoomの実装を行った後、アップデートを行う方法と、その場合の注意点を書こうかと思います。
以上。