アプリ Room を使用してローカル データベース

Room を使用してローカル データベースにデータを保存する

Room の 3 つのコンポーネントを使用すると、こうしたワークフローがシームレスになります。

  1. Room エンティティは、アプリのデータベースのテーブルを表します。テーブルの行に格納されているデータの更新や、挿入するための新しい行の作成に使用します。
  2. Room DAO は、データベース内のデータを取得、更新、挿入、削除するためにアプリで使用するメソッドを提供します。
  3. Room Database クラスは、データベースに関連付けられている DAO のインスタンスをアプリに提供するデータベース クラスです。

公式からはSQLite API を直接使用するのではなく、Room を使用することを強くおすすめされています。

コードサンプル

// entity
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity
data class Item(
    @PrimaryKey val id: Int,
    val name: String,
    val price: Double,
    val quantity: Int
)


// dao
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query
import androidx.room.Update
import androidx.room.Delete

@Dao
interface ItemDao {
    @Query("SELECT * FROM Item")
    fun getAllItems(): List<Item>

    @Query("SELECT * FROM Item WHERE id = :id")
    fun getItemById(id: Int): Item

    @Insert
    fun insertItem(item: Item)

    @Update
    fun updateItem(item: Item)

    @Delete
    fun deleteItem(item: Item)
}

// databse
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

/**
 * Database class with a singleton Instance object.
 * このクラスは、Roomデータベースを表し、シングルトンパターンを使用してデータベースのインスタンスを管理します。
 * シングルトンパターンは、インスタンスがアプリケーション中で一つだけ存在することを保証します。
 */
@Database(entities = [Item::class], version = 1, exportSchema = false) // データベースアノテーション
abstract class InventoryDatabase : RoomDatabase() {
    // itemDao() はデータベース操作のためのDAOを提供するメソッドです。
    abstract fun itemDao(): ItemDao

    companion object {
        @Volatile // このキーワードは、Instance変数が複数のスレッドによって共有されることを示します。
        private var Instance: InventoryDatabase? = null

        // getDatabase() メソッドは、データベースインスタンスを提供または生成します。
        fun getDatabase(context: Context): InventoryDatabase {
            // Instanceが非nullの場合はそれを返し、nullの場合は新しいデータベースインスタンスを生成します。
            return Instance ?: synchronized(this) {
                // RoomのdatabaseBuilderを使用して新しいデータベースインスタンスを生成します。
                Room.databaseBuilder(context, InventoryDatabase::class.java, "item_database")
                    .build() // データベースをビルドする
                    .also { Instance = it } // 生成されたインスタンスをInstanceに格納します。
            }
        }
    }
}

Database Inspector

https://developer.android.com/studio/inspect/database アプリを動作させながらアプリのデータベースの検査、クエリ、変更を行えます。

手順

  1. API レベル 26 以降を搭載した接続済みデバイスまたはエミュレータでアプリを実行します。
  2. Android Studio で、メニューバーから [View] > [Tool Windows] > [App Inspection] を選択します。
  3. [Database Inspector] タブを選択します。
  4. [Database Inspector] ペインのプルダウン メニューから com.example.inventory を選択します(選択されていない場合)。Inventory アプリの item_database が [Databases] ペインに表示されます。
  5. [Databases] ペインで item_database のノードを開き、[Item] を選択して調べます。[Databases] ペインが空の場合はエミュレータを使用し、[Add Item] 画面からデータベースにアイテムを追加します。
  6. Database Inspector の [Live updates] チェックボックスをオンにすると、エミュレータまたはデバイス上で実行中のアプリを操作したときに、表示されるデータが自動的に更新されます。

関連記事