Room 3.0
| อัปเดตล่าสุด | รุ่นที่เสถียร | รุ่นที่อาจได้รับการเผยแพร่ | รุ่นเบต้า | รุ่นอัลฟ่า |
|---|---|---|---|---|
| 6 พฤษภาคม 2026 | - | - | - | 3.0.0-alpha04 |
การประกาศทรัพยากร Dependency
หากต้องการเพิ่มทรัพยากร Dependency ใน Room3 คุณต้องเพิ่มที่เก็บ Maven ของ Google ลงในโปรเจ็กต์ อ่านข้อมูลเพิ่มเติมได้ที่ที่เก็บ 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-alpha04
6 พฤษภาคม 2026
androidx.room3:room3-*:3.0.0-alpha04 เปิดตัวแล้ว เวอร์ชัน 3.0.0-alpha04 มี คอมมิตเหล่านี้
การเปลี่ยนแปลง API
- เพิ่ม API เพื่อกำหนดค่าพูลการเชื่อมต่อของ Room คุณสามารถใช้ฟังก์ชัน Builder
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 ดังนั้นการทำให้ Context เป็นค่าที่ไม่บังคับสำหรับ Builder จะช่วยให้สร้างฐานข้อมูลในหน่วยความจำในโค้ดทั่วไปได้ง่ายขึ้น (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ใน APIfallbackToDestructiveMigration(Ica88b, b/438041176) การเปลี่ยนแปลง API แบบทดลอง
ย้าย
@ExperimentalRoomApiไปยังroom-commonเพื่อให้สามารถทำเครื่องหมาย API ที่อิงตามคำอธิบายประกอบเป็นแบบทดลองได้เพิ่ม
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) ซึ่งหมายความว่า Room 3.0 จะมีกลุ่ม 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 Symbol Processor (KSP) เท่านั้น เพื่อพัฒนาไลบรารีให้ดียิ่งขึ้น เมื่อเทียบกับ Room 2.x แล้ว Room 3.0 จะไม่มีการสร้างโค้ด Java และไม่สามารถกำหนดค่าโปรเซสเซอร์สำหรับคำอธิบายประกอบผ่าน KAPT หรือ JavaAP ได้อีกต่อไป โปรดทราบว่า KSP สามารถประมวลผลแหล่งที่มาของ Java และคอมไพเลอร์ Room จะสร้างโค้ดสำหรับฐานข้อมูล เอนทิตี หรือ DAO ที่การประกาศแหล่งที่มาอยู่ใน Java เราขอแนะนำให้ใช้โปรเจ็กต์แบบหลายโมดูลซึ่งมีการใช้งาน Room เป็นหลัก และสามารถใช้ปลั๊กอิน Kotlin Gradle และ KSP ได้โดยไม่ส่งผลต่อโค้ดเบสส่วนอื่นๆ
Room 3.0 ยังกำหนดให้ใช้ Coroutine และโดยเฉพาะอย่างยิ่ง ฟังก์ชัน DAO ต้องเป็นฟังก์ชันระงับการทำงาน เว้นแต่จะแสดงผลประเภทรีแอกทีฟ เช่น Flow หรือประเภทการแสดงผล DAO ที่กำหนดเอง Room API สำหรับดำเนินการฐานข้อมูลก็เป็นฟังก์ชันระงับการทำงานด้วย เช่น RoomDatabase.useReaderConnection และ RoomDatabase.useWriterConnection
RoomDatabase ไม่สามารถกำหนดค่าด้วย RoomDatabase
ด้วย Executor ได้อีกต่อไป แต่สามารถระบุ CoroutineContext พร้อมกับ Dispatcher ได้
ผ่าน Builder ของฐานข้อมูล
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 ที่ใช้โปรโตคอลการสื่อสารอย่างง่าย ซึ่ง
อธิบายไว้ใน KDoc
ของ WebWorkerSQLiteDriver
ปัจจุบัน 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ซึ่งมีประโยชน์สำหรับการดำเนินการฐานข้อมูลเพิ่มเติม หรือการเข้าถึงขอบเขต CoroutinetableNames: Array<String>: (ไม่บังคับ) มีตารางที่เข้าถึง ของการค้นหา ซึ่งมีประโยชน์สำหรับการรองรับประเภทที่สังเกตได้ / รีแอกทีฟเมื่อ ใช้ร่วมกับInvalidationTracker.createFlow()API ของ RoomrawQuery: RoomRawQuery: (ไม่บังคับ) มีอินสแตนซ์ของการค้นหาในรันไทม์ ซึ่งช่วยให้ใช้การเปลี่ยนแปลง เช่น กลยุทธ์LIMIT/OFFSETที่ใช้งานโดยPagingSourceDaoReturnTypeConverterได้executeAndConvert: suspend () -> T: (บังคับ) ฟังก์ชันที่สร้างขึ้นของ Room ซึ่งจะดำเนินการค้นหาและแยกวิเคราะห์ผลลัพธ์เป็นออบเจ็กต์ข้อมูล
ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อกำหนดในการสร้างตัวแปลงประเภทการแสดงผล DAO
ได้ที่ KDoc ใน @DaoReturnTypeConverter
API