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 migrate
metode 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 = true
di dalam @Database
anotasi 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.grade
modul 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 createSql
dalam migrate
metode 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.java
file. 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 createAllTables
metode ini, akan ada skrip buat semua entitas. Anda bisa mendapatkannya dan memasukkannya ke dalam migrate
metode Anda .
4. Pemrosesan Anotasi.
Seperti yang Anda duga, Room menghasilkan semua yang disebutkan di atas schema
, dan AppDatabase_Impl
file 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 @Entity
dan @Database
. Ambil kelas yang diberi catatan @Entity
misalnya. Ini adalah langkah-langkah yang harus Anda ikuti
- Buat yang baru
StringBuilder
dan tambahkan "BUAT TABEL JIKA TIDAK ADA"
- Dapatkan nama tabel baik dari
class.simplename
atau menurut tableName
bidang @Entity
. Tambahkan keStringBuilder
- Kemudian untuk setiap bidang kelas Anda buat kolom SQL. Ambil nama, jenis, nullability bidang baik menurut bidang itu sendiri atau dengan
@ColumnInfo
anotasi. Untuk setiap bidang, Anda harus menambahkan id INTEGER NOT NULL
gaya kolom ke Anda StringBuilder
.
- Tambahkan kunci utama dengan
@PrimaryKey
- Tambahkan
ForeignKey
dan Indices
jika 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-alpha03
dan 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.