ห้องพักไม่ไม่ได้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. เขียนด้วยตัวเอง
โดยทั่วไปคุณต้องเขียนสคริปต์ด้านบนที่จะตรงกับสคริปต์ที่สร้างห้อง วิธีนี้เป็นไปได้ไม่เป็นไปได้ (พิจารณาว่าคุณมี 50 ช่อง)
2. ส่งออกสคีมา
หากคุณรวมexportSchema = trueไว้ใน@Databaseคำอธิบายประกอบของคุณห้องจะสร้างสคีมาฐานข้อมูลภายใน / สกีมาของโฟลเดอร์โครงการของคุณ ลักษณะการใช้งานคือ
@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. การประมวลผลคำอธิบายประกอบ
อย่างที่คุณคาดเดา Room จะสร้างสิ่งที่กล่าวมาข้างต้นschemaทั้งหมดและAppDatabase_Implไฟล์ภายในเวลารวบรวมและด้วยการประมวลผลคำอธิบายประกอบที่คุณเพิ่มด้วย
kapt "androidx.room:room-compiler:$room_version"
นั่นหมายความว่าคุณสามารถทำเช่นเดียวกันและสร้างไลบรารีการประมวลผลคำอธิบายประกอบของคุณเองซึ่งจะสร้างการสืบค้นสร้างที่จำเป็นทั้งหมดสำหรับคุณ
ความคิดที่จะทำให้ห้องสมุดการประมวลผลคำอธิบายประกอบคำอธิบายประกอบห้องพักของและ@Entity @Databaseใช้ชั้นเรียนที่มีคำอธิบายประกอบ@Entityเช่น นี่คือขั้นตอนที่คุณจะต้องปฏิบัติตาม
- สร้างใหม่StringBuilderและต่อท้าย "CREATE TABLE IF NOT EXISTS"
- ได้รับชื่อของตารางทั้งจากclass.simplenameหรือโดยการด้านการtableName@Entityเพิ่มลงในไฟล์StringBuilder
- จากนั้นสำหรับแต่ละฟิลด์ในชั้นเรียนของคุณให้สร้างคอลัมน์ของ SQL ใช้ชื่อประเภทความว่างเปล่าของฟิลด์โดยตัวฟิลด์เองหรือตาม@ColumnInfoคำอธิบายประกอบ สำหรับทุกฟิลด์คุณต้องเพิ่ม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
น่าเสียดายที่เรายังขาดระบบการย้ายข้อมูลที่ดีกว่า