Room 3.0

  
ไลบรารี Room Persistence มีเลเยอร์การแยกส่วนเหนือ SQLite เพื่อให้เข้าถึงฐานข้อมูลได้อย่างมีประสิทธิภาพมากขึ้นในขณะที่ใช้ประโยชน์จากความสามารถทั้งหมดของ SQLite
อัปเดตล่าสุด รุ่นที่เสถียร รุ่นที่อาจได้รับการเผยแพร่ รุ่นเบต้า รุ่นอัลฟ่า
19 พฤษภาคม 2026 - - - 3.0.0-alpha05

การประกาศทรัพยากร Dependency

หากต้องการเพิ่มทรัพยากร Dependency ใน Room3 คุณต้องเพิ่มที่เก็บ Google Maven ลงในโปรเจ็กต์ อ่านข้อมูลเพิ่มเติมได้ที่ที่เก็บ Maven ของ Google

เพิ่มทรัพยากร Dependency สำหรับอาร์ติแฟกต์ที่ต้องการลงในไฟล์ build.gradle ของแอปหรือโมดูล

Kotlin

dependencies {
    val room_version = ""

    implementation("androidx.room3:room3-runtime:$room_version")
    ksp("androidx.room3:room3-compiler:$room_version")
}

Groovy

dependencies {
    def room_version = ""

    implementation "androidx.room3:room3-runtime:$room_version"

    ksp "androidx.room3:room3-compiler:$room_version"
}

ดูข้อมูลเกี่ยวกับการใช้ปลั๊กอิน KSP ได้ในเอกสารเริ่มต้นใช้งานฉบับย่อของ KSP

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

ใช้ปลั๊กอิน Room Gradle

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

หากต้องการเพิ่มปลั๊กอิน ให้กำหนดปลั๊กอินและเวอร์ชันในไฟล์บิลด์ Gradle ระดับบนสุด

ดึงดูด

plugins {
    id 'androidx.room3' version "$room_version" apply false
}

Kotlin

plugins {
    id("androidx.room3") version "$room_version" apply false
}

ในไฟล์บิลด์ Gradle ระดับโมดูล ให้ใช้ปลั๊กอินและใช้ส่วนขยาย room3

ดึงดูด

plugins {
    id 'androidx.room3'
}

room3 {
    schemaDirectory "$projectDir/schemas"
}

Kotlin

plugins {
    id("androidx.room3")
}

room3 {
    schemaDirectory("$projectDir/schemas")
}

ต้องตั้งค่า schemaDirectory เมื่อใช้ปลั๊กอิน Room Gradle การดำเนินการนี้จะกำหนดค่าคอมไพเลอร์ Room และงานคอมไพล์ต่างๆ รวมถึงแบ็กเอนด์ (kotlinc, KSP) เพื่อส่งออกไฟล์สคีมาไปยังโฟลเดอร์ที่มีรสชาติ เช่น schemas/flavorOneDebug/com.package.MyDatabase/1.json คุณควรเช็คอินไฟล์เหล่านี้ลงในที่เก็บเพื่อใช้สำหรับการตรวจสอบและการย้ายข้อมูลอัตโนมัติ

ความคิดเห็น

ความคิดเห็นของคุณช่วยให้ Jetpack ดีขึ้น โปรดแจ้งให้เราทราบหากพบปัญหาใหม่หรือมีไอเดียในการปรับปรุงไลบรารีนี้ โปรดดู ปัญหาที่มีอยู่แล้ว ในไลบรารีนี้ก่อนสร้างปัญหาใหม่ คุณสามารถโหวตปัญหาที่มีอยู่ได้โดยคลิกปุ่มรูปดาว

สร้างปัญหาใหม่

ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบของIssue Tracker

เวอร์ชัน 3.0

เวอร์ชัน 3.0.0-alpha05

19 พฤษภาคม 2026

androidx.room3:room3-*:3.0.0-alpha05 เปิดตัวแล้ว เวอร์ชัน 3.0.0-alpha05 มี คอมมิตต่อไปนี้

การเปลี่ยนแปลง API

  • อัปเดต @Relation และ @Junction เพื่อให้พร็อพเพอร์ตี้ parentColumns และ entityColumns เป็นอาร์เรย์ของชื่อคอลัมน์ที่จะใช้เป็นคีย์สำหรับการแก้ความสัมพันธ์ ซึ่งจะรองรับคีย์ความสัมพันธ์แบบผสม (I92196, b/64247765)

เวอร์ชัน 3.0.0-alpha04

6 พฤษภาคม 2026

androidx.room3:room3-*:3.0.0-alpha04 เปิดตัวแล้ว เวอร์ชัน 3.0.0-alpha04 มี คอมมิตต่อไปนี้

การเปลี่ยนแปลง API

  • เพิ่ม API เพื่อกำหนดค่าพูลการเชื่อมต่อของ Room คุณสามารถใช้ฟังก์ชันบิลเดอร์ setSingleConnectionPool() และ setMultipleConnectionPool() เพื่อควบคุมจำนวนการเชื่อมต่อสูงสุดที่ Room จะเปิดไปยังฐานข้อมูล (I9700d, b/438041176, b/432820350)
  • นำ DatabaseConfiguration ของ Room ออกจาก API สาธารณะเนื่องจากไม่มี API สาธารณะอื่นๆ อ้างอิงการกำหนดค่า (I5f1e9, b/438041176)

แก้ไขข้อบกพร่อง

  • จำกัดเป้าหมายเว็บให้ใช้พูลการเชื่อมต่อเดียวเพื่อหลีกเลี่ยงปัญหา 'ฐานข้อมูลถูกล็อก' ที่เกิดขึ้นกับ OPFS (b/496255935)
  • พยายามแก้ไข (อีกครั้ง) ข้อผิดพลาด "เมธอดมีขนาดใหญ่เกินไป" ที่เกิดขึ้นเนื่องจาก Room สร้าง onValidateSchema ที่มีขนาดใหญ่เกินไป ระบบจะแยกฟังก์ชันตามจำนวนคำสั่ง แต่การวัดผลไม่แม่นยำ หากยังคงพบข้อผิดพลาดนี้ คุณสามารถปรับจำนวนคำสั่งที่ Room จะนับรวมในการแยกผ่านตัวเลือกโปรเซสเซอร์สำหรับคำอธิบายประกอบ room.validationSplitSize ปัจจุบันค่าเริ่มต้นตั้งไว้ที่ 300 คำสั่ง ดังนั้นให้ใช้ตัวเลขที่ต่ำกว่าหากปัญหายังคงอยู่ (b/493708172)

เวอร์ชัน 3.0.0-alpha03

8 เมษายน 2026

androidx.room3:room3-*:3.0.0-alpha03 เปิดตัวแล้ว เวอร์ชัน 3.0.0-alpha03 มี คอมมิตต่อไปนี้

การเปลี่ยนแปลง API

  • ทำให้คอนสตรักเตอร์แบบไม่มีอาร์กิวเมนต์ของ RoomDatabase เป็นสาธารณะเพื่อหลีกเลี่ยงคำเตือนเครื่องมือวิเคราะห์ซอร์สโค้ด เมื่อมีการอ้างอิงคอนสตรักเตอร์ในการประกาศ @ฐานข้อมูล (I9bac2, b/494722261)
  • เพิ่ม Room.inMemoryDatabaseBuilder และ Room.databaseBuilder เวอร์ชันที่ไม่รับ Context ของ Android ความจำเป็นในการใช้ Context ลดลงอย่างมากใน Room 3.0 ดังนั้นการทำให้เป็นค่าที่ไม่บังคับสำหรับบิลเดอร์จะช่วยให้สร้างฐานข้อมูลในหน่วยความจำในโค้ดทั่วไปได้ง่ายขึ้น (I5d502, b/438041176)

แก้ไขข้อบกพร่อง

  • แก้ไขข้อผิดพลาด "โค้ดมีขนาดใหญ่เกินไป" ในโค้ดที่สร้างโดย JVM และ Android เมื่อเนื้อหาของฟังก์ชัน onValidateSchema มีขนาดใหญ่เกินไป (b/493708172)

เวอร์ชัน 3.0.0-alpha02

25 มีนาคม 2026

androidx.room3:room3-*:3.0.0-alpha02 เปิดตัวแล้ว เวอร์ชัน 3.0.0-alpha02 มี คอมมิตต่อไปนี้

ฟีเจอร์ใหม่

  • การรองรับ FTS5: เพิ่มการรองรับ FTS5 ลงใน Room ผ่านคำอธิบายประกอบ @Fts5 ซึ่งรวมถึงค่าคงที่ใหม่สำหรับตัวแยกคำ FTS5 (TOKENIZER_ASCII และ TOKENIZER_TRIGRAM) และ Enum สำหรับตัวเลือก FTS "detail" (FULL, COLUMN, และ NONE) (I90934, b/146824830)
  • เป้าหมายการเพจจิ้งของ Room: เพิ่มเป้าหมาย js, wasmJs, tvOS และ watchOS ลงใน room3-paging (Icffd3, b/432783733)

การเปลี่ยนแปลง API

  • `clearAllTables()` หลายแพลตฟอร์มclearAllTables(): ทำให้ clearAllTables() เป็นแบบทั่วไปเพื่อให้ใช้งานได้ในทุกแพลตฟอร์ม นอกจากนี้ยังแปลงเป็นฟังก์ชัน suspend แล้วด้วย (I434ae, b/322846465)
  • การย้ายข้อมูลแบบทำลายล้าง: เพิ่มค่าพารามิเตอร์เริ่มต้นลงใน dropAllTables ใน API fallbackToDestructiveMigration (Ica88b, b/438041176)
  • การเปลี่ยนแปลง API แบบทดลอง

    1. ย้าย @ExperimentalRoomApi ไปที่ room-common เพื่อให้สามารถทำเครื่องหมาย API ที่อิงตามคำอธิบายประกอบเป็นแบบทดลองได้

    2. เพิ่ม RoomWarning แบบทดลองเพื่อระงับข้อกำหนดสำหรับ @ConstructedBy ในการประกาศฐานข้อมูล Room ในกรณีนี้ ระบบจะไม่สร้าง DatabaseConstructor และต้องมีการใช้งาน Factory ผ่าน DatabaseBuilder (If5443)

แก้ไขข้อบกพร่อง

  • แหล่งข้อมูลการแบ่งหน้า: อัปเดต PagingSourceDaoReturnTypeConverter เพื่อระบุอย่างถูกต้องว่าฟังก์ชัน Convert มีไว้สำหรับการค้นหา READ (I3b067, b/139872302)

เวอร์ชัน 3.0.0-alpha01

11 มีนาคม 2026

androidx.room3:room3-*:3.0.0-alpha01 เปิดตัวแล้ว

Room 3.0 (แพ็กเกจ androidx.room3) เป็นการอัปเดตเวอร์ชันหลักของ Room 2.x แพ็กเกจ (androidx.room) ที่เน้น Kotlin Multiplatform (KMP)

API คำอธิบายประกอบหลักจะยังคงเหมือนเดิมพร้อมกับคอมโพเนนต์หลักต่อไปนี้

  • คลาสแอบสแตรกต์ที่ขยาย androidx.room3.RoomDatabase และมีคำอธิบายประกอบด้วย @Database เป็นจุดเริ่มต้นสำหรับโปรเซสเซอร์สำหรับคำอธิบายประกอบของ Room
  • การประกาศฐานข้อมูลมีคลาสข้อมูลอย่างน้อย 1 คลาสที่อธิบายสคีมาฐานข้อมูลและมีคำอธิบายประกอบด้วย @Entity
  • การดำเนินการฐานข้อมูลจะกำหนดไว้ในการประกาศ @Dao ที่มีฟังก์ชันการค้นหาซึ่งคำสั่ง SQL กำหนดไว้ผ่านคำอธิบายประกอบ @Query
  • ในรันไทม์ คุณจะรับการใช้งานฐานข้อมูลได้ผ่าน RoomDatabase.Builder ซึ่งใช้กำหนดค่าฐานข้อมูลด้วย

เอกสารประกอบส่วนใหญ่ในคู่มือบันทึกข้อมูลในฐานข้อมูลของเครื่องโดยใช้ Roomยังคง เกี่ยวข้องกับ Room 3.0

ความแตกต่างที่สำคัญระหว่าง Room 2.x มีดังนี้

  • แพ็กเกจใหม่ androidx.room3
  • ไม่รองรับ SupportSQLite API อีกต่อไป เว้นแต่คุณจะใช้ androidx.room3:room3-sqlite-wrapper
  • การดำเนินการฐานข้อมูลทั้งหมดเป็น API ที่อิงตาม Coroutine แล้ว
  • การสร้างโค้ด Kotlin เท่านั้น
  • ต้องใช้ Kotlin Symbol Processing (KSP)

นอกจากการเปลี่ยนแปลงที่ทำให้เกิดการหยุดทำงานแล้ว Room 3.0 ยังมีฟังก์ชันการทำงานใหม่เมื่อเทียบกับ 2.x ดังนี้

  • การรองรับ JS และ WasmJS
  • ประเภทการแสดงผล DAO ที่กำหนดเอง

แพ็กเกจใหม่

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

ไม่มี SupportSQLite API

Room 3.0 ได้รับการสนับสนุนอย่างเต็มที่จาก SQLiteDriver APIs และไม่ใช้อ้างอิงประเภท SupportSQLite เช่น SupportSQLiteDatabase หรือประเภท Android เช่น Cursor อีกต่อไป นี่เป็นการเปลี่ยนแปลงที่สำคัญที่สุดระหว่าง Room 3.0 กับ 2.x เนื่องจากระบบได้นำ RoomDatabase API ที่จำลอง SupportSQLiteDatabase พร้อมกับ API เพื่อรับ SupportSQLiteOpenHelper ออกแล้ว ตอนนี้ ต้อง มี SQLiteDriver เพื่อสร้าง RoomDatabase

ตัวอย่างเช่น ระบบจะแทนที่ API สำหรับการดำเนินการฐานข้อมูลโดยตรงด้วย API ที่เทียบเท่าของไดรเวอร์

// Room 2.x
roomDatabase.runInTransaction { ... }

// Room 3.x
roomDatabase.withWriteTransaction { ... }
// Room 2.x
roomDatabase.query("SELECT * FROM Song").use { cursor -> ... }

// Room 3.x
roomDatabase.useReaderConnection { connection ->
  connection.usePrepared("SELECT * FROM Song") { stmt -> ... }
}

นอกจากนี้ ระบบยังได้แทนที่ Callback API ที่มี SupportSQLiteDatabase เป็นอาร์กิวเมนต์ด้วย API ที่เทียบเท่าซึ่งมี SQLiteConnection เป็นอาร์กิวเมนต์ ซึ่งเป็นฟังก์ชัน Callback การย้ายข้อมูล เช่น Migration.onMigrate() และ AutoMigrationSpec.onPostMigrate() รวมถึง Callback ฐานข้อมูล เช่น RoomDatabase.Callback.onCreate(), RoomDatabase.Callback.onOpen() เป็นต้น

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

SupportSQLite Wrapper

Room 3.x จะเก็บ SupportSQLite Wrapper ที่สร้างขึ้นใน 2.x ไว้เพื่อลดความซับซ้อนในการย้ายข้อมูล และตอนนี้อยู่ในอาร์ติแฟกต์ใหม่ androidx.room3:room3-sqlite-wrapper API ความเข้ากันได้ช่วยให้คุณแปลง RoomDatabase เป็น SupportSQLiteDatabase ได้ คุณสามารถแทนที่การเรียกใช้ roomDatabase.openHelper.writableDatabase ด้วย roomDatabase.getSupportWrapper()

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

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

Room 3.0 ยังกำหนดให้ต้องใช้ Coroutine และโดยเฉพาะอย่างยิ่ง ฟังก์ชัน DAO ต้องเป็นฟังก์ชันระงับการทำงาน เว้นแต่จะแสดงผลประเภทรีแอกทีฟ เช่น Flow หรือประเภทการแสดงผล DAO ที่กำหนดเอง Room API สำหรับการดำเนินการฐานข้อมูลยังเป็นฟังก์ชันระงับการทำงานด้วย เช่น RoomDatabase.useReaderConnection และ RoomDatabase.useWriterConnection

เมื่อเทียบกับ Room 2.x คุณจะไม่สามารถกำหนดค่า RoomDatabase ด้วย Executor ได้อีกต่อไป แต่สามารถระบุ CoroutineContext พร้อมกับ Dispatcher ผ่านบิลเดอร์ของฐานข้อมูลได้

InvalidationTracker API ใน Room 3.0 อิงตาม Flow โดยระบบได้นำ InvalidationTracker.Observer ออกพร้อมกับ API ที่เกี่ยวข้อง addObserver และ removeObserver กลไกในการตอบสนองต่อการดำเนินการฐานข้อมูลคือผ่าน Coroutine Flow ที่สร้างได้ผ่าน createFlow() API ใน InvalidationTracker

ตัวอย่างการใช้งาน

fun getArtistTours(from: Date, to: Date): Flow<Map<Artist, TourState>> {
    return db.invalidationTracker.createFlow("Artist").map { _ ->
        val artists = artistsDao.getAllArtists()
        val tours = tourService.fetchStates(artists.map { it.id })
        associateTours(artists, tours, from, to)
    }
}

การรองรับเว็บ

Room 3.0 เวอร์ชันนี้เพิ่ม JavaScript และ WasmJs เป็นเป้าหมาย KMP เมื่อใช้ร่วมกับ การเปิดตัวอินเทอร์เฟซ SQLiteDriver (androidx.sqlite:sqlite) ซึ่ง กำหนดเป้าหมายเป็น JavaScript และ WasmJs ด้วย รวมถึงไดรเวอร์ใหม่ WebWorkerSQLiteDriver ที่อยู่ในอาร์ติแฟกต์ใหม่ androidx.sqlite:sqlite-web คุณจะใช้ Room ในโค้ดทั่วไปที่กำหนดเป้าหมายเป็นแพลตฟอร์ม KMP หลักทั้งหมดได้

เนื่องจากแพลตฟอร์มเว็บทำงานแบบไม่พร้อมกัน Room API ที่ใช้ SQLiteStatement เป็นอาร์กิวเมนต์จึงเป็นฟังก์ชันระงับการทำงานแล้ว ตัวอย่างฟังก์ชันเหล่านี้ ได้แก่ Migration.onMigrate(), RoomDatabase.Callback.onCreate(), PooledConnection.usePrepared() และอื่นๆ ใน Driver API, API แบบไม่พร้อมกันเป็นแบบทั่วไปในทุกแพลตฟอร์ม และ API แบบพร้อมกันเป็นแบบทั่วไปสำหรับเป้าหมายที่ไม่ใช่เว็บ ดังนั้น โปรเจ็กต์ที่ไม่ได้กำหนดเป้าหมายเป็นเว็บจึงยังคงใช้ API แบบพร้อมกัน (SQLiteDriver.open(), SQLiteConnection.prepare() และ SQLiteStatement.step()) ในโค้ดทั่วไปได้ ในขณะเดียวกัน โปรเจ็กต์ที่กำหนดเป้าหมายเป็นเว็บเท่านั้นต้องใช้ API แบบไม่พร้อมกัน (SQLiteDriver.openAsync(), SQLiteConnection.prepareAsync() และ SQLiteStatement.stepAsync())

แพ็กเกจ androidx.sqlite ยังได้เพิ่มฟังก์ชันส่วนขยายระงับการทำงานที่มีชื่อแบบพร้อมกันของ API ที่กล่าวถึง (โดยเพิ่ม SQLiteConnection.executeSQL) เพื่อความสะดวก เราขอแนะนำให้ใช้ API เหล่านี้เมื่อโปรเจ็กต์กำหนดเป้าหมายเป็นทั้งแพลตฟอร์มเว็บและที่ไม่ใช่เว็บ เนื่องจาก API เป็นการประกาศแบบ expect / actual ที่จะเรียกตัวแปรที่เหมาะสมตามแพลตฟอร์ม API เหล่านี้เป็น API ที่รันไทม์ของ Room ใช้และเปิดใช้การใช้งานไดรเวอร์ในโค้ดทั่วไปสำหรับแพลตฟอร์มที่รองรับทั้งหมด

ตัวอย่างการใช้งาน

import androidx.sqlite.executeSQL
import androidx.sqlite.step

roomDatabase.useWriterConnection { connection ->
    val deletedSongs = connection.usePrepared(
        "SELECT count(*) FROM Song"
    ) { stmt ->
        stmt.step()
        stmt.getLong(0)
    }
    connection.executeSQL("DELETE FROM Song")
    deletedSongs
}

WebWorkerSQLiteDriver เป็นการใช้งาน SQLiteDriver ที่ สื่อสารกับ Web Worker เพื่อดำเนินการฐานข้อมูลนอกเธรดหลักและช่วยให้จัดเก็บ ฐานข้อมูลใน Origin Private File System (OPFS) ได้ หากต้องการสร้างอินสแตนซ์ของไดรเวอร์ คุณต้องมี Worker ที่ใช้โปรโตคอลการสื่อสารอย่างง่าย โปรโตคอลนี้อธิบายไว้ใน WebWorkerSQLiteDriver KDoc

ปัจจุบัน WebWorkerSQLiteDriver ไม่ได้มาพร้อมกับ Worker เริ่มต้นที่ ใช้โปรโตคอลการสื่อสาร แต่โค้ดเบส androidx มีการใช้งาน Worker ที่คุณใช้ในโปรเจ็กต์ได้ โดยจะใช้ WASM ของ SQLite's และจัดเก็บฐานข้อมูลใน OPFS. ระบบเผยแพร่ Worker ตัวอย่างเป็นแพ็กเกจ NPM ในเครื่อง และด้วยการรองรับทรัพยากร Dependency ของ NPM ใน Kotlin คุณจึงสร้างโมดูล KMP ขนาดเล็กเพื่อให้บริการ Worker ได้

ดูโปรเจ็กต์ GitHub ต่อไปนี้ ที่แสดงการใช้งาน Web Worker ในเครื่องสำหรับ Room

เมื่อตั้งค่า Worker ในโปรเจ็กต์แล้ว การกำหนดค่า Room สำหรับเว็บจะคล้ายกับแพลตฟอร์มอื่นๆ ดังนี้

fun createDatabase(): MusicDatabase {
    return Room.databaseBuilder<MusicDatabase>("music.db")
        .setDriver(WebWorkerSQLiteDriver(createWorker()))
        .build()
}

fun createWorker() =
    Worker(js("""new URL("sqlite-web-worker/worker.js", import.meta.url)"""))

ไดรเวอร์เว็บเวอร์ชันในอนาคตอาจมี Worker เริ่มต้นที่เผยแพร่ใน NPM ซึ่งจะทำให้การตั้งค่าเว็บง่ายขึ้น

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

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

ตัวอย่างเช่น หากต้องการให้การค้นหา DAO แสดงผล PagingSource ตอนนี้ต้องลงทะเบียนคลาสตัวแปลงที่อยู่ใน androidx.room3:room3-paging

@Dao
@DaoReturnTypeConverters(PagingSourceDaoReturnTypeConverter::class)
interface MusicDao {
    @Query("SELECT * FROM Song)
    fun getSongsPaginated(): PagingSource<Int, Song>
}

ระบบได้ย้ายการผสานรวมที่มีอยู่ไปยังตัวแปลงประเภทการแสดงผล DAO แล้ว

ประเภทการแสดงผล คลาสตัวแปลง อาร์ติแฟกต์
PagingSource PagingSourceDaoReturnTypeConverter androidx.room3:room3-paging
Observable, Flowable, Completable, Single, Maybe RxDaoReturnTypeConverters androidx.room3:room3-rxjava3
ListenableFuture GuavaDaoReturnTypeConverter androidx.room3:room3-guava
LiveData LiveDataDaoReturnTypeConverter androidx.room3:room3-livedata

ตัวแปลงประเภทคอลัมน์และตัวแปลงประเภทการแสดงผล DAO สามารถกำหนดได้โดยแอปพลิเคชัน ตัวอย่างเช่น แอปพลิเคชันสามารถประกาศ @DaoReturnTypeConverter สำหรับประเภทเว็บ kotlin.js.Promise

object PromiseDaoReturnTypeConverter {
    @DaoReturnTypeConverter([OperationType.READ, OperationType.WRITE])
    fun <T> convert(
        db: RoomDatabase,
        executeAndConvert: suspend () -> T
    ): Promise<T> {
        return db.getCoroutineScope().promise { executeAndConvert() }
    }
}

จากนั้นตัวแปลงด้านบนจะอนุญาตให้ฟังก์ชันการค้นหา DAO แสดงผล Promise ได้

@Dao
@DaoReturnTypeConverters(PromiseDaoReturnTypeConverter::class)
interface MusicDao {
    @Query("SELECT * FROM Song")
    fun getAllSongs(): Promise<List<Song>>
}

ฟังก์ชัน @DaoReturnTypeConverter มีข้อกำหนดบางประการเกี่ยวกับจำนวนพารามิเตอร์ที่ต้องมีและประเภทของพารามิเตอร์ พารามิเตอร์ที่เป็นไปได้มีดังนี้

  • db: RoomDatabase: (ไม่บังคับ) ให้สิทธิ์เข้าถึงอินสแตนซ์ RoomDatabase ซึ่งมีประโยชน์สำหรับการดำเนินการฐานข้อมูลเพิ่มเติม หรือการเข้าถึงขอบเขต Coroutine
  • tableNames: Array<String>: (ไม่บังคับ) มีตารางที่เข้าถึง ของการค้นหา ซึ่งมีประโยชน์สำหรับการรองรับประเภทที่สังเกตได้ / รีแอกทีฟเมื่อ ใช้ร่วมกับ InvalidationTracker.createFlow() API ของ Room
  • rawQuery: RoomRawQuery: (ไม่บังคับ) มีอินสแตนซ์ของการค้นหาในรันไทม์ ซึ่งช่วยให้ใช้การแปลง เช่น กลยุทธ์ LIMIT / OFFSET ที่ PagingSourceDaoReturnTypeConverter ใช้
  • executeAndConvert: suspend () -> T: (บังคับ) ฟังก์ชันที่สร้างโดย Room ซึ่งจะดำเนินการค้นหาและแยกวิเคราะห์ผลลัพธ์เป็นออบเจ็กต์ข้อมูล

ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อกำหนดในการสร้างตัวแปลงประเภทการแสดงผล DAO ได้ที่ KDoc ใน @DaoReturnTypeConverter API