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 と共に動作するように構築されています。 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の依存関係を追加する
- これをプロジェクトに追加するには、プロジェクトレベルの
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 で実行