ข่าวสารผลิตภัณฑ์

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 ที่ส่งผลกับส่วนอื่นในระบบต่อไปนี้ 

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

แพ็กเกจใหม่

Room 3.0 จะอยู่ในแพ็กเกจใหม่เพื่อป้องกันปัญหาความเข้ากันได้กับการติดตั้งใช้งาน Room 2.x ที่มีอยู่ และสำหรับไลบรารีที่มีทรัพยากร Dependency แบบทรานซิทีฟกับ Room (เช่น WorkManager) ซึ่งหมายความว่าจะมีกลุ่ม Maven และรหัสอาร์ติแฟกต์ใหม่ด้วย เช่น 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 Plugin และ KSP ได้โดยไม่ส่งผลกระทบต่อส่วนอื่นๆ ของฐานของโค้ด

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

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

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

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

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

Room SupportSQLite Wrapper

เราเข้าใจว่าการนำ 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 บนเว็บ

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

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

ประเภทการคืนค่า DAO ที่กำหนดเอง

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

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

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

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

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

ความคิดขั้นสุดท้าย

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

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