Ruangan yang tidak memiliki baik Migrasi Sistem, setidaknya tidak sampai 2.1.0-alpha03.
Jadi, hingga kami memiliki Sistem Migrasi yang lebih baik, ada beberapa solusi untuk memudahkan Migrasi di dalam Ruangan.
Karena tidak ada metode seperti @Database(createNewTables = true) atau MigrationSystem.createTable(User::class), yang seharusnya ada satu atau lainnya, satu-satunya cara yang mungkin adalah berjalan
CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))
di dalam migratemetode Anda .
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`))")
}
}
Untuk mendapatkan skrip SQL di atas , Anda memiliki 4 cara
1. Tulis sendiri
Pada dasarnya, Anda harus menulis skrip di atas yang akan cocok dengan skrip yang dihasilkan Room. Cara ini mungkin, tidak mungkin. (Pertimbangkan Anda memiliki 50 bidang)
2. Skema Ekspor
Jika Anda menyertakan exportSchema = truedi dalam @Databaseanotasi Anda , Room akan menghasilkan skema database dalam / skema folder proyek Anda. Penggunaannya
@Database(entities = [User::class], version = 2, exportSchema = true)
abstract class AppDatabase : RoomDatabase {
}
Pastikan Anda telah menyertakan baris di bawah ini dalam build.grademodul aplikasi Anda
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas".toString())
}
}
Saat Anda menjalankan atau membangun proyek, Anda akan mendapatkan file JSON 2.json, yang memiliki semua kueri dalam database Room Anda.
"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
},
Jadi, Anda dapat memasukkan di atas createSqldalam migratemetode Anda .
3. Dapatkan kueri dari AppDatabase_Impl
Jika Anda tidak ingin mengekspor skema, Anda masih bisa mendapatkan kueri dengan menjalankan atau membangun proyek yang akan menghasilkan AppDatabase_Impl.javafile. dan dalam file tertentu yang dapat Anda miliki.
@Override
public void createAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))");
Dalam createAllTablesmetode ini, akan ada skrip buat semua entitas. Anda bisa mendapatkannya dan memasukkannya ke dalam migratemetode Anda .
4. Pemrosesan Anotasi.
Seperti yang Anda duga, Room menghasilkan semua yang disebutkan di atas schema, dan AppDatabase_Implfile dalam waktu kompilasi dan dengan Pemrosesan Anotasi yang Anda tambahkan
kapt "androidx.room:room-compiler:$room_version"
Itu berarti Anda juga dapat melakukan hal yang sama dan membuat pustaka pemrosesan anotasi Anda sendiri yang menghasilkan semua kueri pembuatan yang diperlukan untuk Anda.
Idenya adalah membuat pustaka pemrosesan anotasi untuk anotasi Room @Entitydan @Database. Ambil kelas yang diberi catatan @Entitymisalnya. Ini adalah langkah-langkah yang harus Anda ikuti
- Buat yang baru
StringBuilderdan tambahkan "BUAT TABEL JIKA TIDAK ADA"
- Dapatkan nama tabel baik dari
class.simplenameatau menurut tableNamebidang @Entity. Tambahkan keStringBuilder
- Kemudian untuk setiap bidang kelas Anda buat kolom SQL. Ambil nama, jenis, nullability bidang baik menurut bidang itu sendiri atau dengan
@ColumnInfoanotasi. Untuk setiap bidang, Anda harus menambahkan id INTEGER NOT NULLgaya kolom ke Anda StringBuilder.
- Tambahkan kunci utama dengan
@PrimaryKey
- Tambahkan
ForeignKeydan Indicesjika ada.
- Setelah selesai mengubahnya menjadi string dan menyimpannya di beberapa kelas baru yang ingin Anda gunakan. Misalnya simpan seperti di bawah ini
public final class UserSqlUtils {
public String createTable = "CREATE TABLE IF NOT EXISTS User (id INTEGER, PRIMARY KEY(id))";
}
Kemudian, Anda dapat menggunakannya sebagai file
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL(UserSqlUtils().createTable)
}
}
Saya membuat perpustakaan seperti itu untuk diri saya sendiri yang dapat Anda periksa, dan bahkan menggunakannya dalam proyek Anda. Perhatikan bahwa perpustakaan yang saya buat tidak penuh dan hanya memenuhi persyaratan saya untuk pembuatan tabel.
RoomExtension untuk Migrasi yang lebih baik
Aplikasi yang menggunakan RoomExtension
Semoga bermanfaat.
MEMPERBARUI
Pada saat menulis jawaban ini, versi kamar adalah 2.1.0-alpha03dan ketika saya mengirim email kepada pengembang, saya mendapat tanggapan
Diharapkan memiliki Sistem Migrasi yang lebih baik 2.2.0
Sayangnya, kami masih kekurangan Sistem Migrasi yang lebih baik.