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

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 ได้รับการสนับสนุนอย่างเต็มที่จาก androidx.sqlite driver APIs API ของ SQLiteDriver เข้ากันได้กับ KMP และการนำทรัพยากร Dependency ของ Room ออกจาก API ของ Android จะช่วยลดความซับซ้อนของ 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 ของ Room เป็น Coroutines เป็นอันดับแรก โครูทีนเป็นเฟรมเวิร์กแบบอะซิงโครนัสที่เข้ากันได้กับ 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 First

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

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

การย้ายข้อมูลไปยัง 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 ได้ แม้ว่า 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 เป็นฟังก์ชันระงับเนื่องจากการรองรับที่เหมาะสมสำหรับพื้นที่เก็บข้อมูลบนเว็บเป็นแบบอะซิงโครนัส นอกจากนี้ API ของ SQLiteDriver ยังได้รับการอัปเดตให้รองรับเว็บ และมีไดรเวอร์อะซิงโครนัสใหม่สำหรับเว็บใน androidx.sqlite:sqlite-web ซึ่งเป็นไดรเวอร์ที่อิงตาม Web Worker ที่ช่วยให้จัดเก็บฐานข้อมูลในระบบไฟล์ส่วนตัวของต้นทาง (OPFS) ได้

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

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

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

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

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

เขียนโดย

อ่านต่อ