ข่าวสารเกี่ยวกับผลิตภัณฑ์

Room 3.0 - การปรับปรุง Room ให้ทันสมัย

ใช้เวลาอ่าน 4 นาที
ดูโปรไฟล์ของ Daniel Santiago Rivera
Daniel Santiago Rivera วิศวกรซอฟต์แวร์

Room 3.0 เวอร์ชันอัลฟ่าแรกเปิดตัวแล้ว Room 3.0 เป็นเวอร์ชันไลบรารีที่มีการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบครั้งใหญ่ ซึ่งมุ่งเน้นที่ Kotlin Multiplatform (KMP) และเพิ่มการรองรับ JavaScript และ WebAssembly (WASM) นอกเหนือจากการรองรับ Android, iOS และ JVM Desktop ที่มีอยู่

ในบล็อกนี้ เราจะสรุปการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบ เหตุผลที่อยู่เบื้องหลัง Room 3.0 และสิ่งต่างๆ ที่คุณทำได้เพื่อย้ายข้อมูลจาก Room 2.0

การเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบ

Room 3.0 มีการเปลี่ยนแปลง API ที่ส่งผลกับส่วนอื่นในระบบดังนี้

  • การเลิกใช้ API ของ SupportSQLite: Room 3.0 ได้รับการสนับสนุนอย่างเต็มที่จาก API ของไดรเวอร์ androidx.sqlite API ของ SQLiteDriver เข้ากันได้กับ KMP และการนำการพึ่งพา API ของ Android ออกจาก Room จะช่วยลดความซับซ้อนของ API สำหรับ Android เนื่องจากหลีกเลี่ยงการมีแบ็กเอนด์ที่เป็นไปได้ 2 รายการ
  • ไม่มีการสร้างโค้ด Java อีกต่อไป: Room 3.0 จะสร้างโค้ด Kotlin เท่านั้น ซึ่งสอดคล้องกับกระบวนทัศน์ Kotlin-first ที่พัฒนาขึ้น แต่ยังช่วยลดความซับซ้อนของฐานโค้ดและกระบวนการพัฒนา ทำให้สามารถทำซ้ำได้เร็วขึ้น
  • มุ่งเน้นที่ KSP: เรายังเลิกใช้การประมวลผลคำอธิบายประกอบ Java (AP) และ KAPT ด้วย Room 3.0 เป็นตัวประมวลผล KSP (Kotlin Symbol Processing) เท่านั้น ซึ่งช่วยให้ประมวลผลฐานโค้ด Kotlin ได้ดียิ่งขึ้นโดยไม่ถูกจำกัดด้วยภาษา Java
  • Coroutines เป็นอันดับแรก: Room 3.0 รองรับ Kotlin Coroutines ทำให้ API เป็น Coroutines-first Coroutines เป็นเฟรมเวิร์กแบบอะซิงโครนัสที่เข้ากันได้กับ KMP และการทำให้ Room เป็นแบบอะซิงโครนัสโดยธรรมชาติเป็นข้อกำหนดที่สำคัญสำหรับการรองรับแพลตฟอร์มเว็บ

แพ็กเกจใหม่

Room 3.0 อยู่ในแพ็กเกจใหม่ ซึ่งหมายความว่าจะมีกลุ่ม Maven และรหัสอาร์ติแฟกต์ใหม่ด้วย เพื่อป้องกันปัญหาความเข้ากันได้กับการติดตั้งใช้งาน Room 2.x ที่มีอยู่และสำหรับไลบรารีที่มีการพึ่งพา Room แบบทรานซิทีฟ (เช่น WorkManager) ตัวอย่างเช่น androidx.room:room-runtime กลายเป็น androidx.room3:room3-runtime และคลาสต่างๆ เช่น androidx.room.RoomDatabase จะอยู่ใน androidx.room3.RoomDatabase แล้ว

Kotlin และ Coroutines เป็นอันดับแรก

เมื่อไม่มีการสร้างโค้ด Java อีกต่อไป Room 3.0 จึงต้องใช้ KSP และคอมไพเลอร์ Kotlin แม้ว่าฐานโค้ดที่โต้ตอบกับ Room จะอยู่ใน Java ก็ตาม เราขอแนะนำให้ใช้โปรเจ็กต์แบบหลายโมดูลซึ่งมีการใช้งาน Room เป็นหลัก และสามารถใช้ปลั๊กอิน Kotlin Gradle และ KSP ได้โดยไม่ส่งผลต่อฐานโค้ดส่วนอื่นๆ

Room 3.0 ยังต้องใช้ Coroutines และฟังก์ชัน DAO ต้องเป็นแบบระงับ (Suspended) เว้นแต่จะแสดงผลประเภทรีแอกทีฟ เช่น Flow Room 3.0 ไม่อนุญาตฟังก์ชัน DAO แบบบล็อก โปรดดู เอกสารประกอบเกี่ยวกับ Coroutines ใน Android เกี่ยวกับการเริ่มต้นผสานรวม Coroutines เข้ากับแอปพลิเคชัน

การย้ายข้อมูลไปยัง API ของ SQLiteDriver

เมื่อเปลี่ยนไปใช้ SupportSQLite แล้ว แอปจะต้องย้ายข้อมูลไปยัง API ของ SQLiteDriver การย้ายข้อมูลนี้มีความสำคัญอย่างยิ่งต่อการใช้ประโยชน์จาก Room 3.0 อย่างเต็มที่ ซึ่งรวมถึงการอนุญาตให้ใช้ไลบรารี SQLite ที่รวมไว้ผ่าน BundledSQLiteDriver คุณเริ่มย้ายข้อมูลไปยัง API ของไดรเวอร์ได้แล้ววันนี้ด้วย Room 2.7.0 ขึ้นไป เราขอแนะนำอย่างยิ่งให้หลีกเลี่ยงการใช้ SupportSQLite ต่อไป หากคุณย้ายข้อมูลการผสานรวม Room ไปยัง API ของ SQLiteDriver การเปลี่ยนไปใช้ Room 3.0 จะง่ายขึ้นเนื่องจากการเปลี่ยนแปลงแพ็กเกจส่วนใหญ่เกี่ยวข้องกับการอัปเดตการอ้างอิงสัญลักษณ์ (การนำเข้า) และอาจต้องมีการเปลี่ยนแปลงเล็กน้อยในตำแหน่งที่เรียกใช้

โปรดดูภาพรวมสั้นๆ ของ API ของ SQLiteDriver ได้ใน เอกสารประกอบเกี่ยวกับ API ของ SQLiteDriver

ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีย้ายข้อมูล Room ไปใช้ API ของ SQLiteDriver ได้ใน เอกสารประกอบอย่างเป็นทางการสำหรับการย้ายข้อมูลจาก SupportSQLite

Wrapper ของ Room SupportSQLite

เราเข้าใจว่าการนำ SupportSQLite ออกทั้งหมดอาจไม่ใช่เรื่องง่ายสำหรับบางโปรเจ็กต์ Room 2.8.0 ซึ่งเป็น Room 2.0 เวอร์ชันล่าสุดจึงได้เปิดตัวอาร์ติแฟกต์ใหม่ที่ชื่อว่า androidx.room:room-sqlite-wrapper เพื่อให้การเปลี่ยนผ่านนี้ง่ายขึ้น อาร์ติแฟกต์นี้มี API ความเข้ากันได้ที่ช่วยให้คุณแปลง RoomDatabase เป็น SupportSQLiteDatabase ได้ แม้ว่า API ของ SupportSQLite ในฐานข้อมูลจะถูกปิดใช้เนื่องจากมีการติดตั้ง SQLiteDriver ซึ่งเป็นสะพานชั่วคราวสำหรับนักพัฒนาแอปที่ต้องการเวลาเพิ่มเติมในการย้ายข้อมูลฐานโค้ดทั้งหมด อาร์ติแฟกต์นี้จะยังคงอยู่ใน Room 3.0 ในชื่อ androidx.room3:room3-sqlite-wrapper เพื่อให้การย้ายข้อมูลไปยัง Room 3.0 เป็นไปได้ในขณะที่ยังคงรองรับการใช้งาน SupportSQLite ที่สำคัญ

ตัวอย่างเช่น การเรียกใช้ roomDatabase.openHelper.writableDatabase สามารถแทนที่ด้วย roomDatabase.getSupportWrapper() และระบบจะแสดง Wrapper แม้ว่าจะมีการเรียกใช้ setDriver() ใน Builder ของ Room ก็ตาม

ดูรายละเอียดเพิ่มเติมได้ใน เอกสารประกอบเกี่ยวกับ room-sqlite-wrapper

การรองรับเว็บของ Room และ SQLite

การรองรับเป้าหมาย JS และ WasmJS ของ Kotlin Multiplatform ทำให้เกิดการเปลี่ยนแปลง API ที่สำคัญที่สุดบางอย่าง โดยเฉพาะอย่างยิ่ง API หลายรายการใน Room 3.0 เป็นฟังก์ชันระงับ (Suspended) เนื่องจากระบบรองรับพื้นที่เก็บข้อมูลเว็บอย่างเหมาะสมแบบอะซิงโครนัส นอกจากนี้ API ของ SQLiteDriver ยังได้รับการอัปเดตให้รองรับเว็บ และไดรเวอร์แบบอะซิงโครนัสสำหรับเว็บใหม่พร้อมใช้งานใน androidx.sqlite:sqlite-web ซึ่งเป็นไดรเวอร์ที่อิงตาม Web Worker ที่ช่วยให้เก็บข้อมูลฐานข้อมูลไว้ในระบบไฟล์ส่วนตัวของ Origin (OPFS)

ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีตั้งค่า Room สำหรับเว็บได้ใน บันทึกประจำรุ่นของ Room 3.0

ประเภทการแสดงผลที่กำหนดเองของ DAO

Room 3.0 มีความสามารถในการเพิ่มการผสานรวมที่กำหนดเองลงใน Room ซึ่งคล้ายกับ RxJava และ Paging คุณสามารถสร้างการผสานรวมของคุณเองผ่าน API คำอธิบายประกอบใหม่ที่ชื่อว่า @DaoReturnTypeConverter เพื่อให้โค้ดที่สร้างขึ้นของ Room เข้าถึงได้ในรันไทม์ ซึ่งจะช่วยให้ฟังก์ชัน @Dao มีประเภทการแสดงผลที่กำหนดเองได้โดยไม่ต้องรอให้ทีม Room เพิ่มการรองรับ การผสานรวมที่มีอยู่จะย้ายข้อมูลไปใช้ฟังก์ชันนี้ ดังนั้นผู้ที่ใช้ฟังก์ชันนี้จะต้องเพิ่มตัวแปลงลงในคำจำกัดความ @Database หรือ @Dao

ตัวอย่างเช่น ตัวแปลง Paging จะอยู่ในอาร์ติแฟกต์ androidx.room3:room3-paging และมีชื่อว่า PagingSourceDaoReturnTypeConverter ส่วนตัวแปลง LiveData จะอยู่ใน androidx.room3:room3-livedata และมีชื่อว่า LiveDataDaoReturnTypeConverter

ดูรายละเอียดเพิ่มเติมได้ในส่วนตัวแปลงประเภทการแสดงผลของ DAO ใน บันทึกประจำรุ่นของ Room 3.0

โหมดการบำรุงรักษาของ Room 2.x

เนื่องจากการพัฒนา Room จะมุ่งเน้นไปที่ Room 3 เวอร์ชัน Room 2.x ปัจจุบันจึงเข้าสู่โหมดการบำรุงรักษา ซึ่งหมายความว่าจะไม่มีการพัฒนาฟีเจอร์หลัก แต่จะยังคงมีการเผยแพร่แพตช์ (2.8.1, 2.8.2 ฯลฯ) พร้อมการแก้ไขข้อบกพร่องและการอัปเดตการพึ่งพา ทีมงานมุ่งมั่นที่จะดำเนินการนี้ต่อไปจนกว่า Room 3 จะเสถียร

ข้อคิดเห็นสุดท้าย

เรารู้สึกตื่นเต้นอย่างยิ่งกับศักยภาพของ Room 3.0 และโอกาสที่ Room 3.0 จะมอบให้กับระบบนิเวศ Kotlin โปรดติดตามข้อมูลอัปเดตเพิ่มเติมในขณะที่เราดำเนินการต่อไป

เขียนโดย:
อ่านต่อ