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

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

ใช้เวลาอ่าน 4 นาที
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 API: Room 3.0 ได้รับการสนับสนุนอย่างเต็มที่จาก API ไดรเวอร์ androidx.sqlite 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 เป็น Coroutines-first โครูทีนเป็นเฟรมเวิร์กแบบอะซิงโครนัสที่ใช้ได้กับ KMP และการทำให้ Room เป็นแบบอะซิงโครนัสโดยธรรมชาติเป็นข้อกำหนดที่สำคัญสำหรับการรองรับแพลตฟอร์มเว็บ

แพ็กเกจใหม่

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

Kotlin และ Coroutines First

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

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

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

เมื่อเปลี่ยนไปใช้ SQLiteDriver API แทน SupportSQLite แอปจะต้องย้ายข้อมูลไปยัง SQLiteDriver API การย้ายข้อมูลนี้มีความสำคัญอย่างยิ่งต่อการใช้ประโยชน์จาก Room 3.0 อย่างเต็มที่ ซึ่งรวมถึงการอนุญาตให้ใช้ไลบรารี SQLite ที่รวมไว้ผ่าน BundledSQLiteDriver คุณเริ่มย้ายข้อมูลไปยัง Driver 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 ได้ แม้ว่าจะมีการปิดใช้ SupportSQLite API ในฐานข้อมูลเนื่องจากมีการติดตั้ง 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 @DaoReturnTypeConverter API คำอธิบายประกอบใหม่ช่วยให้คุณสร้างการผสานรวมของคุณเองเพื่อให้โค้ดที่ 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 จึงเข้าสู่โหมดการบำรุงรักษา ซึ่งหมายความว่าจะไม่มีการพัฒนาฟีเจอร์หลักๆ แต่จะยังมีการเผยแพร่แพตช์ (2.8.1, 2.8.2 ฯลฯ) พร้อมการแก้ไขข้อบกพร่องและการอัปเดตทรัพยากร Dependency ทีมงานมุ่งมั่นที่จะทำงานนี้ต่อไปจนกว่า Room 3 จะเสถียร

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

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

เขียนโดย

อ่านต่อ