ルームデータベースを使う|Android Jetpack

Ashish Rawat

Follow

Feb 23, 2019 – 6 min read

Android Jetpack が何であるかを知らない人のために

Android Jetpack は、優れた Android アプリを容易に開発するための Android ソフトウェア コンポーネントのコレクションです。

  • ベスト プラクティスに従う。
  • 定型的なコードを書くことから解放される。

以下は、Android Developers Channel の動画です。

では、Room について説明します

Room は永続化ライブラリで、Android Jetpack に含まれています。

Android Developers Channel の動画です。

Room は SQLite 上の抽象化レイヤーを提供し、SQLite のフル パワーを利用しながら流暢なデータベース アクセスを可能にします。 各 @Query と @Entity はコンパイル時にチェックされるので、実行時のクラッシュ問題からアプリを保護し、構文のみをチェックするだけでなく、テーブルの欠落もチェックします。

  • ボイラープレート コード
  • 他のアーキテクチャ コンポーネント (LiveData など) と簡単に統合できる
  • SQLite 使用時の主な問題点は

    • 生の SQL クエリのコンパイル時検証がないことです。 たとえば、実際のデータベースに存在しない間違った列名を持つ SQL クエリを書いた場合、実行時に例外が発生し、コンパイル時にこの問題を把握することはできません。
    • SQL クエリと Java データ オブジェクト (POJO) の間で変換するために、多くの定型コードを使用する必要があります。

    Room vs SQLite

    Room は ORM、オブジェクト リレーショナル マッピング ライブラリです。 言い換えれば、Room はデータベースオブジェクトを Java オブジェクトにマッピングします。 Room は SQLite の上に抽象化レイヤーを提供し、SQLite のパワーをフルに活用しながら、流暢なデータベース アクセスを可能にします。 しかし、Room では、コンパイル時に SQL 検証が行われます。

  • SQL クエリと Java データ オブジェクトの間を変換するために、多くの定型コードを使用する必要があります。
  • スキーマが変更された場合、影響を受ける SQL クエリを手動で更新する必要があります。 SQLite はそうではありませんが、Room はデータ観測のために LiveData と RxJava と共に動作するように構築されています。
  • Room is awesome

    Components of Room DB

    Room には Room DB の主要コンポーネントが 3 つあります :

    • Entity
    • Dao
    • Database

    Entity

    データベース内のテーブルを表現します。 Room は、@Entity アノテーションを持つ各クラスに対してテーブルを作成し、クラスのフィールドはテーブルの列に対応します。 したがって、エンティティ クラスは、ロジックを含まない小さなモデル クラスになる傾向があります。

    Entities annotations

    エンティティのモデリングを開始する前に、いくつかの便利なアノテーションとその属性を知っておく必要があります。

    @Entity – このアノテーションを持つすべてのモデル クラスは、DB

    • foreignKeys – 外部キーの名前
    • indices – テーブル上で示すリスト
    • primaryKeys – エンティティ主キーの名前
    • tableName

    @PrimaryKey – その名前が示すように、このキーは、エンティティを表す。 このアノテーションは、エンティティの主キーを指します。 autoGenerate – true に設定すると、SQLite はカラムに対して一意の ID を生成します

    @PrimaryKey(autoGenerate = true)

    @ColumnInfo – カラムに関するカスタム情報を指定できます

    @ColumnInfo(name = "column_name")

    @Ignore – Room

    によりフィールドは持続しません

    @Embedged – SQL クエリーで入れ子フィールドは直接参照できます

    @Embedded – SQL クエリーでは入れ子のフィールドは無視できます。

    Dao

    DAO は、データベースにアクセスするメソッドを定義する役割を担っています。 初期のSQLiteでは、Cursorオブジェクトを使用しています。 Room では、すべての Cursor 関連のコードは必要なく、単に Dao クラスのアノテーションを使用してクエリを定義できます。

    Database

    データベース ホルダーを含み、アプリケーションの永続的なリレーショナル データへの基礎的な接続の主要アクセス ポイントとして機能します。 このクラスは @Database でアノテーションされ、データベースに含まれるエンティティ、およびそれらにアクセスする DAO をリストします。

    @Database でアノテーションされるクラスは、次の条件を満たす必要があります。

  • アノテーション内にデータベースに関連付けられたエンティティのリストを含める。
  • 引数が0で、@Daoでアノテーションされたクラスを返す抽象メソッドを含む。
  • 実行時に、Room.databaseBuilder()またはRoom.inMemoryDatabaseBuilder()を呼び出してDatabaseのインスタンスを取得することができます。

    ステップ1:Gradleの依存関係を追加する

    1. これをプロジェクトに追加するには、プロジェクトレベルのbuild.gradleファイルを開き、以下のようにハイライトした行を追加します:

    2. アプリまたはモジュールの build.gradle ファイルを開き、依存関係を追加します:

    Step 2: モデル クラスを作成

    Room は @Entity で注釈が付いた各クラスに対して表を作成し、クラス内のフィールドは表内の列と対応します。 そのため、エンティティクラスはロジックを含まない小さなモデルクラスになりがちです。 私たちのPersonクラスは、データベース内のデータのモデルを表しています。

    • @Entity でクラスをアノテートし、tableName プロパティを使用してテーブルの名前を設定します。
    • 正しいフィールドに @PrimaryKey アノテーションを追加して、主キーを設定します。
    • 複数のコンストラクターが適切な場合、@Ignore アノテーションを追加して、使用するものとしないものを Room に知らせます。

    Step 3: データ アクセス オブジェクト (DAO) の作成

    DAO はデータベースにアクセスするメソッドを定義する役割を担っている。

    DAO を作成するには、インターフェイスを作成し、@Dao .7975>

    Step 4 – Create the database

    データベースを作成するには、RoomDatabaseを拡張する抽象クラス定義を作成する必要があります。 このクラスは @Database でアノテーションされ、データベースに含まれるエンティティ、およびそれらにアクセスする DAO をリストします。

    ステップ 4: データの管理

    データを管理するには、最初に、データベースのインスタンスを作成する必要があります。

    次に、データベースを挿入、削除、および更新します。

    すべての操作が別のスレッドで実行されることを確認します。 私の場合、Executers(ここを参照)

    Query:

    Insert:

    Delete:

    Update:

    Executer で実行

    Room Databaseの例を見る必要がある場合は、レポもリンクしておきますね。

    コメントする