部屋には、少なくともまでは、適切な移行システムがありません2.1.0-alpha03
。
したがって、より良い移行システムができるまでは、会議室で簡単に移行できるようにいくつかの回避策があります。
@Database(createNewTables = true)
またはのようなメソッドは存在しないためMigrationSystem.createTable(User::class)
、実行できるのは唯一の可能な方法です
CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))
migrate
メソッド内。
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))")
}
}
上記のSQLスクリプトを取得するには、4つの方法があります
1.自分で書く
基本的には、Roomが生成するスクリプトと一致する上記のスクリプトを記述する必要があります。この方法は可能ですが、実現不可能です。(50のフィールドがあることを考慮してください)
2.スキーマのエクスポート
アノテーションexportSchema = true
内に含めると@Database
、Roomはプロジェクトフォルダーの/ schemas内にデータベーススキーマを生成します。使い方は
@Database(entities = [User::class], version = 2, exportSchema = true)
abstract class AppDatabase : RoomDatabase {
//...
}
build.grade
アプリモジュールの以下の行が含まれていることを確認してください
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas".toString())
}
}
プロジェクトを実行またはビルドすると、JSONファイルが取得されます2.json
。このファイルには、Roomデータベース内のすべてのクエリが含まれています。
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "325bd539353db508c5248423a1c88c03",
"entities": [
{
"tableName": "User",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
したがって、メソッドcreateSql
内に上記を含めることができますmigrate
。
3. AppDatabase_Implからクエリを取得する
スキーマをエクスポートしたくない場合でも、AppDatabase_Impl.java
ファイルを生成するプロジェクトを実行またはビルドすることで、クエリを取得できます。そして、あなたが持つことができる指定されたファイル内で。
@Override
public void createAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))");
createAllTables
メソッド内には、すべてのエンティティの作成スクリプトがあります。それを取得して、migrate
メソッド内に含めることができます。
4.注釈処理。
お察しの通り、部屋は、上記のすべてを生成しschema
、そしてAppDatabase_Impl
あなたが追加注釈処理、コンパイル時間内とを持つファイル
kapt "androidx.room:room-compiler:$room_version"
つまり、同じことを行って、必要なすべての作成クエリを生成する独自の注釈処理ライブラリを作成することもできます。
アイデアは、@Entity
とのRoomアノテーション用のアノテーション処理ライブラリを作成すること@Database
です。@Entity
たとえば、注釈が付けられたクラスを考えてみましょう。これらはあなたが従わなければならないステップです
- 新しいものを作成し
StringBuilder
、「存在しない場合はテーブルを作成」を追加
- から、
class.simplename
またはのtableName
フィールドでテーブル名を取得します@Entity
。それをあなたに追加StringBuilder
- 次に、クラスのフィールドごとにSQLの列を作成します。フィールド自体または
@ColumnInfo
注釈のいずれかによる、フィールドの名前、タイプ、null可能性を取得します。すべてのフィールドについてid INTEGER NOT NULL
、列のスタイルをに追加する必要がありますStringBuilder
。
- 主キーを追加
@PrimaryKey
- 追加
ForeignKey
しIndices
、存在する場合。
- 文字列に変換した後、使用したい新しいクラスに保存します。たとえば、以下のように保存します
public final class UserSqlUtils {
public String createTable = "CREATE TABLE IF NOT EXISTS User (id INTEGER, PRIMARY KEY(id))";
}
その後、次のように使用できます
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL(UserSqlUtils().createTable)
}
}
自分でチェックできるライブラリを自分で作成し、プロジェクトで使用することもできます。私が作成したライブラリは完全ではなく、テーブル作成の要件を満たしていることに注意してください。
より良い移行のためのRoomExtension
RoomExtensionを使用するアプリケーション
お役に立てば幸いです。
更新
この回答を書いている時点で、ルームバージョンはで2.1.0-alpha03
あり、開発者にメールを送信したときに、
より良い移行システムが期待されます 2.2.0
残念ながら、まだより良い移行システムがありません。