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ファイル内に以下を記述します。

dependencies {
    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のインスタンスがそのままデータベースのレコードの用に保存されるため、保存用のクラスを作成します。例は以下です。

@Entity
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でそれらをあらかじめ記述しておきます。例は以下です。

@Dao
interface TestDataDao{
    @Query("SELECT * FROM TestData")
    fun select(): List<TestData>

    @Insert
    fun insert(vararg data: TestData)

    @Update
    fun update(vararg data: TestData)

    @Delete
    fun delete(vararg data: TestData)
}

上記の例は、先程のTestDataクラス用のDaoになります。Daoはinterfaceの形を取ります。

SQL文を直に記述する場合は、@Queryアノテーションを用いて例のように記述します。例の場合、selectメソッドを呼ぶと、TestDataテーブル(クラス)をSELECTした全レコード(インスタンス)をListにしたものが帰ってきます。

代表的なSQL文は予めアノテーションが用意されているため、例を参考に各メソッドを用意しておきます。


4.データベースのテーブルとDao一覧を作成する

先程、TestDataクラスを作成しましたが、アプリを作成する場合、保存するテーブルは複数になることがほどんどです。このいくつもあるテーブルやそれぞれのDaoをRoomで一括管理するためのクラスを作成する必要があります(テーブルが一つでも必要)。例は以下です。

@Database(
    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でデータベースを作成し、その変数越しにアクセスを行います。

データベースビルダーは以下で作成できます。

db = Room
    .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の実装を行った後、アップデートを行う方法と、その場合の注意点を書こうかと思います。

以上。

このブログの人気の投稿

動画編集ソフト「Shotcut」で縦向きの動画を横向きにする方法。

Audacityで音声部分のみを自動カットする方法

Android Studioでの動的なLayoutの幅と高さの変更方法