記事ディレクトリ
1. オブジェクト リレーショナル マッピング - ORM / オブジェクト リレーショナル マッピング
Android システムで使用されるデータベースはSQLite リレーショナル データベースですが、Android が提供する API を使用して SQLite データベースにアクセスするのは非常に面倒なため、多くのORM フレームワークが登場しています。
ORM 英語の正式名称オブジェクト リレーショナル マッピング、オブジェクト リレーショナル マッピング。
オブジェクト リレーショナル マッピング ORM はプログラミング テクノロジであり、オブジェクト指向プログラミング言語とリレーショナルデータベース間のマッピング。
- オブジェクトはオブジェクト指向プログラミング言語を指し、
- リレーショナルはリレーショナル データベースを指します。
ORM オブジェクト リレーショナル マッピング フレームワークを使用してデータベースにアクセスすると、データベース操作プロセスを簡素化できます. 開発者は、オブジェクト指向 API を使用してデータベースと対話します。
ORM フレームワークは、多くの場合、メタデータデータベーステーブルをプログラミング言語のクラスにマップし、データベース テーブル フィールドはクラス内のフィールドに対応します。一般的に使用されるメタデータは次のとおりです。
- 注釈
- 構成ファイル
ORM フレームワークの利点:
- 開発効率の向上: ORM を使用してデータベースを操作すると、データベース操作プロセスが簡素化され、コードの開発と保守が容易になります。
- 移植性の向上: ORM フレームワークを使用してデータベースを操作すると、コードを変更せずに基盤となるデータベースを置き換えることができます。
- パフォーマンスの向上: ORM フレームワークの操作の追加、削除、チェック、および変更のパフォーマンスは、一般的に。
- セキュリティの向上: SQL ステートメントを直接使用してクエリを実行すると、SQL インジェクション攻撃を回避できます。
一般的な ORM フレームワーク:
- Android プラットフォーム: GreenDao / ORMLite ;
- JavaEE プラットフォーム: 休止状態;
- .NET プラットフォーム: エンティティ フレームワーク;
- Python プラットフォーム: DiagoORM;
Android では、Google が公式に SQLite リレーショナル データベース操作のカプセル化に基づく ORM フレームワーク、Room フレームワークを提供しています。
2. Room フレームワークのコンポーネント
1. @Entity / @Dao / @Database アノテーション
Room フレームワークの重要な注釈:
- @Entity アノテーション:データベース内のテーブル構造に対応するJavaBean エンティティ クラスを変更するために使用されます。
- @Dao アノテーション:データベースアクセス オブジェクト クラスを変更するために使用されます。これは、データベースの追加、削除、変更、およびチェックの機能を定義します。
- @Database アノテーション:データベースホルダーを変更します。データベース ホルダーはデータベース リンク オブジェクトであり、アプリケーション永続データの基礎となる接続のアクセス ポイントです。
- @Database アノテーションで装飾されたクラスは、RoomDatabase 抽象クラスを継承する必要があります。
- この注釈では、データベース関連のエンティティ クラスのリストを定義する必要があります。
- DatabaseHolder には、Dao オブジェクトを返すパラメーターのない抽象メソッドが含まれています。
2. Entityエンティティクラス/Daoデータベースアクセスオブジェクト/データベースデータベースホルダーの関係
データベース データベース ホルダー、Dao (データ アクセス オブジェクト) データベース アクセス オブジェクト、エンティティ エンティティ クラス、3 つの関係は次のとおりです。
- まず、 Android アプリケーションで、Room フレームワークのデータベースを介してデータベース ホルダー オブジェクトを取得します。
- 次に、 データベース ホルダー データベースを介して Dao (Data Access Objects) データベース アクセス オブジェクトを取得します。
- 最後に、 Dao (データ アクセス オブジェクト) データベース アクセス オブジェクトを介して、データベース内の各テーブルに対応するエンティティ エンティティ クラス オブジェクトにアクセスします。
3. Room フレームワークを使用する手順
Room フレームワークの使用手順:
- Room フレームワークの依存関係を追加する
- エンティティ エンティティ クラスの作成
- Dao エンティティ クラスの作成
- RoomDatabase データベース インスタンス オブジェクトを作成する
- Room データベースを初期化する
- Dao を呼び出して、データベースの追加、削除、変更、およびクエリ操作を実行する
1. Room フレームワークの依存関係を追加する
Module module の下のbuild.gradle ビルド スクリプトで、次の依存関係を構成します。
dependencies {
// 配置 Room 框架版本号
def room_version = "2.4.0"
// 核心运行时依赖库 在应用运行时提供 Room 框架的数据库相关核心功能
implementation "androidx.room:room-runtime:$room_version"
// 编译时依赖项 在编译时实时生成 Room 代码 如 : Dao 实现类 / AppDatabase 子类 / Entity 实体类映射器
annotationProcessor "androidx.room:room-compiler:$room_version"
// 可选配置项 - 支持 Kotlin 扩展和协程的 Room 框架 如果使用的是 Kotlin 语言必须导入该依赖
implementation "androidx.room:room-ktx:$room_version"
}
androidx.room:room-runtime 依存ライブラリはランタイム、アプリケーションの実行時に Room フレームワークのデータベース関連のコア機能を提供します。依存ライブラリには、次のようなRoom 永続ライブラリのコア機能が含まれています。 :
- RoomDatabase クラス: 1 つ以上のテーブルを含むことができるデータベースを表すために使用され、データの挿入、削除、クエリなど、データベースを操作するいくつかのメソッドを提供します。
- エンティティ アノテーション: エンティティ クラスをマークしたり、エンティティ クラスに対応するデータベース テーブルの名前とフィールド情報を指定したりするために使用されます。
- Dao データベース アクセス オブジェクト: クエリ、挿入、削除操作など、データベースにアクセスするためのメソッドを定義するために使用されます。
- クエリ アノテーション: DAO インターフェイスでメソッドをマークし、SQL クエリ ステートメントを指定するために使用されます。
- PrimaryKey アノテーション: エンティティ クラスで主キー フィールドを指定するために使用されます。
- TypeConverters 注釈: 型コンバーター クラスをマークして、特定の型のデータをデータベース内のネイティブ型に変換するために使用されます。
androidx.room:room-compiler 依存関係ライブラリは、Room 永続ライブラリのコンパイル、コンパイル時に。
- データベースを作成してアクセスするためのAppDatabase のサブクラス。
- SQL クエリおよび操作を実行するためのDao データベース アクセス オブジェクト実装クラス。
- エンティティ クラス Entity のマッパーは、データベース内のデータをエンティティ クラスにマップするために使用されます。
androidx.room: room-ktx は、Kotlin 拡張機能を提供するライブラリに依存します. Kotlin 言語を使用する場合は、依存ライブラリをインポートする必要があります。
2. Entity エンティティ クラスを作成する
データベース内のテーブルに対応するEntity エンティティ クラスを作成し、次の注釈を使用して変更する必要があります
- @Entity アノテーションを使用してエンティティ クラスを変更し、データベース テーブル名を指定します。
- @PrimaryKey アノテーションを使用して、主キーの値を変更します。
- @ColumnInfo アノテーションを使用して、データベース テーブルの列名に対応するフィールドを変更します。
@Entity(tableName = "users")
data class User(
@PrimaryKey val id: Int,
@ColumnInfo(name = "name") val name: String,
@ColumnInfo(name = "age") val age: Int
)
3. Dao エンティティ クラスを作成する
Dao エンティティ クラスの作成: データベースにアクセスするための DAO インターフェイスを作成し、注釈を使用して SQL クエリ ステートメントなどの情報を指定します。
- @Dao アノテーションを使用して Dao エンティティ クラス全体を変更します。
- @Query アノテーションを使用してクエリ関数を変更します。
- @Insert アノテーションを使用して挿入関数を変更します。
- @Delete アノテーションを使用して削除機能を変更します。
@Dao
interface UserDao {
@Query("SELECT * FROM users")
fun getAll(): List<User>
@Insert
fun insert(user: User)
@Delete
fun delete(user: User)
}
4. RoomDatabase データベース インスタンス オブジェクトを作成する
RoomDatabase データベース インスタンス オブジェクトを作成します。RoomDatabase のサブクラス インスタンス オブジェクトを作成し、抽象メソッドを定義して DAO インスタンスを取得します。
@Database(entities = arrayOf(User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
5. Room データベースの初期化
データベースの初期化: アプリケーションで Room データベースを使用する前に、まずデータベース インスタンスを作成する必要があります。
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "database-name"
).build()
6. Dao を呼び出して、データベースの追加、削除、変更、およびクエリ操作を実行します。
Dao を呼び出して、データベースの追加、削除、変更、およびクエリ操作を実行します。
db.userDao().insert(User(1, "John", 25))
val users = db.userDao().getAll()