ย้ายข้อมูลจาก SQLite ไปยังห้องแชท

ไลบรารี Room Persistence มีประโยชน์มากมายมากกว่าการใช้ SQLite API โดยตรง ดังนี้

  • การตรวจสอบการค้นหา SQL ในเวลาคอมไพล์
  • คำอธิบายประกอบที่สะดวกซึ่งช่วยลดโค้ดเทมเพลตที่ต้องใช้บ่อยๆ และมีแนวโน้มที่จะเกิดข้อผิดพลาด
  • เส้นทางการย้ายข้อมูลฐานข้อมูลที่มีประสิทธิภาพ

หากแอปของคุณมีการใช้งาน SQLite ที่ไม่ใช่ Room โปรดอ่านหน้านี้เพื่อดูวิธีย้ายข้อมูลไปยัง Room หาก Room เป็นการใช้งาน SQLite ครั้งแรกในแอป โปรดดูการบันทึกข้อมูลในฐานข้อมูลภายในเครื่องโดยใช้ Room สำหรับการใช้งานพื้นฐาน

ขั้นตอนการย้ายข้อมูล

ทำตามขั้นตอนต่อไปนี้เพื่อย้ายข้อมูลการใช้งาน SQLite ไปยัง Room หากการใช้งาน SQLite ของคุณใช้ฐานข้อมูลขนาดใหญ่หรือการค้นหาที่ซับซ้อน คุณอาจต้องการย้ายข้อมูลไปยัง Room ทีละน้อย ดูข้อมูลเพิ่มเติมเกี่ยวกับกลยุทธ์การย้ายข้อมูลแบบเพิ่มทีละน้อย ได้ที่ การย้ายข้อมูลแบบเพิ่มทีละน้อย

อัปเดตทรัพยากร Dependency

หากต้องการใช้ Room ในแอป คุณต้องใส่ทรัพยากร Dependency ที่เหมาะสมในไฟล์ build.gradle ของแอป ดูข้อมูลเพิ่มเติมเกี่ยวกับทรัพยากร Dependency ของ Room ได้ที่ การตั้งค่า

อัปเดตคลาสโมเดลเป็นเอนทิตีข้อมูล

Room ใช้เอนทิตีข้อมูลเพื่อแสดงตารางในฐานข้อมูล คลาสเอนทิตีแต่ละคลาสแสดงตารางและมีพร็อพเพอร์ตี้ที่แสดงคอลัมน์ในตารางนั้น ทำตามขั้นตอนต่อไปนี้เพื่ออัปเดตคลาสโมเดลที่มีอยู่ให้เป็นเอนทิตี Room

  1. ใส่คำอธิบายประกอบในการประกาศคลาสด้วย @Entity เพื่อระบุว่าเป็นเอนทิตี Room คุณเลือกใช้พร็อพเพอร์ตี้ tableName เพื่อ ระบุว่าตารางที่ได้ควรมีชื่อแตกต่างจาก ชื่อคลาสได้
  2. ใส่คำอธิบายประกอบ @PrimaryKey ในพร็อพเพอร์ตี้คีย์หลัก
  3. หากคอลัมน์ใดคอลัมน์หนึ่งในตารางที่ได้ควรมีชื่อแตกต่างจากชื่อพร็อพเพอร์ตี้ที่เกี่ยวข้อง ให้ใส่คำอธิบายประกอบในพร็อพเพอร์ตี้ด้วย @ColumnInfo และตั้งค่าพร็อพเพอร์ตี้ name เป็นชื่อคอลัมน์ที่ถูกต้อง
  4. หากคลาสมีพร็อพเพอร์ตี้ที่คุณไม่ต้องการให้คงอยู่ในฐานข้อมูล ให้ใส่คำอธิบายประกอบในพร็อพเพอร์ตี้เหล่านั้นด้วย @Ignore เพื่อระบุว่า Room ไม่ควรสร้างคอลัมน์สำหรับพร็อพเพอร์ตี้เหล่านั้นในตารางที่เกี่ยวข้อง
  5. หากคลาสมีตัวสร้างมากกว่า 1 รายการ ให้ระบุตัวสร้างที่ Room ควรใช้โดยใส่คำอธิบายประกอบ @Ignore ในตัวสร้างอื่นๆ ทั้งหมด

@Entity(tableName = "users")
data class User(
    @PrimaryKey @ColumnInfo(name = "userid") val id: String,
    @ColumnInfo(name = "username") val userName: String?,
    @ColumnInfo(name = "last_update") val date: Date?,
)

สร้าง DAO

Room ใช้ออบเจ็กต์การเข้าถึงข้อมูล (DAO) เพื่อกำหนดฟังก์ชันที่เข้าถึงฐานข้อมูล ทำตามคำแนะนำใน การเข้าถึงข้อมูลโดยใช้ DAO ของ Room เพื่อแทนที่ ฟังก์ชันการค้นหาที่มีอยู่ด้วย DAO

สร้างคลาสฐานข้อมูล

การใช้งาน Room ใช้คลาสฐานข้อมูลเพื่อจัดการอินสแตนซ์ของฐานข้อมูล คลาสฐานข้อมูลควรขยาย RoomDatabase และอ้างอิง เอนทิตีและ DAO ทั้งหมดที่คุณกำหนดไว้

@Database(entities = [User::class], version = 2)
@ColumnTypeConverters(DateConverter::class)
abstract class UsersDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

กำหนดเส้นทางการย้ายข้อมูล

เนื่องจากหมายเลขเวอร์ชันฐานข้อมูลมีการเปลี่ยนแปลง คุณจึงต้องกำหนดa Migration เพื่อเก็บรักษาข้อมูลฐานข้อมูลที่มีอยู่ หากสคีมาฐานข้อมูลไม่เปลี่ยนแปลง การย้ายข้อมูลนี้อาจว่างเปล่า

val MIGRATION_1_2 = object : Migration(1, 2) {
    override suspend fun migrate(connection: SQLiteConnection) {
        // Empty implementation, because the schema isn't changing.
    }
}

ดูข้อมูลเพิ่มเติมเกี่ยวกับเส้นทางการย้ายข้อมูลฐานข้อมูลใน Room ได้ที่ ย้ายข้อมูลฐานข้อมูล

อัปเดตการสร้างอินสแตนซ์ฐานข้อมูล

หลังจากกำหนดคลาสฐานข้อมูลและเส้นทางการย้ายข้อมูลแล้ว คุณสามารถใช้ Room.databaseBuilder เพื่อสร้างอินสแตนซ์ของฐานข้อมูลโดยใช้ เส้นทางการย้ายข้อมูลได้ดังนี้

val db =
    Room.databaseBuilder<UsersDatabase>(applicationContext, "database-name")
        .addMigrations(MIGRATION_1_2)
        .build()

ทดสอบการใช้งาน

ตรวจสอบว่าคุณได้ทดสอบการใช้งาน Room ใหม่แล้ว โดยทำดังนี้

การย้ายข้อมูลแบบเพิ่มทีละน้อย

หากแอปของคุณใช้ฐานข้อมูลขนาดใหญ่และซับซ้อน การย้ายข้อมูลแอปไปยัง Room ทั้งหมดในคราวเดียวอาจทำได้ยาก คุณจึงเลือกที่จะใช้เอนทิตีข้อมูลและฐานข้อมูล Room เป็นขั้นตอนแรก แล้วย้ายข้อมูลฟังก์ชันการค้นหาไปยัง DAO ในภายหลังได้

หากต้องการใช้การย้ายข้อมูลแบบเพิ่มทีละน้อย ให้รับ Wrapper ความเข้ากันได้ SupportSQLiteDatabase โดยใช้ฟังก์ชันส่วนขยาย roomDatabase.getSupportWrapper จากอาร์ติแฟกต์ androidx.room3:room3-sqlite-wrapper Wrapper นี้ช่วยให้คุณเรียกใช้การค้นหา SQL สไตล์ Android โดยตรงในฐานข้อมูลที่จัดการโดย Room โดยใช้ Android SQLite API ได้ดังนี้

// Get SupportSQLiteDatabase wrapper
val legacyDb = roomDatabase.getSupportWrapper()
legacyDb.execSQL("INSERT INTO users ...")