Room 3.0
| อัปเดตล่าสุด | รุ่นที่เสถียร | รุ่นที่อาจได้รับการเผยแพร่ | รุ่นเบต้า | รุ่นอัลฟ่า |
|---|---|---|---|---|
| 17 มิถุนายน 2026 | - | 3.0.0-rc01 | - | - |
การประกาศทรัพยากร 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-rc01
17 มิถุนายน 2026
androidx.room3:room3-*:3.0.0-rc01 เปิดตัวแล้ว เวอร์ชัน 3.0.0-rc01 มีคอมมิตเหล่านี้
ฟีเจอร์ใหม่
- เพิ่มการรองรับพารามิเตอร์ที่มีค่าเริ่มต้นในคลาสข้อมูลที่ใช้ในผลลัพธ์การค้นหา DAO ระบบจะถือว่าพร็อพเพอร์ตี้ที่แสดงคอลัมน์และเป็นส่วนหนึ่งของคอนสตรักเตอร์ที่มีค่าเริ่มต้นเป็นพร็อพเพอร์ตี้ที่ไม่บังคับ และไม่จำเป็นต้องมีคอลัมน์ในผลลัพธ์สำหรับพร็อพเพอร์ตี้นั้น (34279a, b/70762008, b/193531601)
การเปลี่ยนแปลง API
- เปลี่ยนชื่อ
@TypeConverterเป็น@ColumnTypeConverterเพื่อแยกขอบเขตของการแปลงให้ชัดเจนขึ้น และให้สอดคล้องกับ@DaoReturnTypeConverter(I24420, b/438041176) - เพิ่ม API สำหรับประเภทการแสดงผล DAO ที่กำหนดเอง
@ProvidedDaoReturnTypeConveter(I2a8ad, b/517485682) - เพิ่มพร็อพเพอร์ตี้
PrimaryKey.algorihtmเพื่อระบุอัลกอริทึมการสร้างคีย์หลักเมื่อตั้งค่าPrimaryKey.autoGenerateเป็น "จริง" (I57944, b/70053837)
เวอร์ชัน 3.0.0-alpha06
3 มิถุนายน 2026
androidx.room3:room3-*:3.0.0-alpha06 เปิดตัวแล้ว เวอร์ชัน 3.0.0-alpha06 มี คอมมิตเหล่านี้
การเปลี่ยนแปลง API
- เพิ่มพร็อพเพอร์ตี้คำอธิบายประกอบใหม่ใน
@Entityที่ชื่อwithoutRowIdซึ่งเมื่อตั้งค่าเป็น "จริง" จะสร้างตาราง SQLite แบ็กเอนด์โดยใช้ตัวเลือกWITHOUT ROWID(Idb48e, b/472790803)
เวอร์ชัน 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เป็นสาธารณะเพื่อหลีกเลี่ยงคำเตือน Lint เมื่อมีการอ้างอิงคอนสตรักเตอร์ในการประกาศ @Database (I9bac2, b/494722261) - เพิ่มเวอร์ชันของ
Room.inMemoryDatabaseBuilderและRoom.databaseBuilderที่ไม่ต้องใช้บริบท Android ความจำเป็นในการใช้บริบทลดลงอย่างมากใน 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ใน 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 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 ที่กำหนดเอง API ของ Room สำหรับการดำเนินการฐานข้อมูลยังเป็นฟังก์ชันระงับการทำงานด้วย เช่น RoomDatabase.useReaderConnection และ RoomDatabase.useWriterConnection
เมื่อเทียบกับ Room 2.x แล้ว คุณไม่สามารถกำหนดค่า RoomDatabase ด้วย Executor ได้อีกต่อไป แต่สามารถระบุ CoroutineContext พร้อมกับ Dispatcher ผ่านบิลเดอร์ของฐานข้อมูลได้
API InvalidationTracker ใน Room 3.0 อิงตาม Flow โดยระบบได้นำ
InvalidationTracker.Observer ออกพร้อมกับ API ที่เกี่ยวข้อง
addObserver และ removeObserver กลไกในการตอบสนองต่อการดำเนินการฐานข้อมูลคือผ่าน Coroutine Flow ที่สร้างได้ผ่าน API createFlow() ใน 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 หลักทั้งหมดได้
เนื่องจากแพลตฟอร์มเว็บทำงานแบบอะซิงโครนัส API ของ Room ที่ใช้ SQLiteStatement เป็นอาร์กิวเมนต์จึงเป็นฟังก์ชันระงับการทำงานแล้ว ตัวอย่างฟังก์ชันเหล่านี้ ได้แก่ Migration.onMigrate(), RoomDatabase.Callback.onCreate(), PooledConnection.usePrepared() และอื่นๆ ใน 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ซึ่งอาจมีประโยชน์สำหรับการดำเนินการฐานข้อมูลเพิ่มเติม หรือการเข้าถึงขอบเขต CoroutinetableNames: Array<String>: (ไม่บังคับ) มีตารางที่เข้าถึง ของการค้นหา ซึ่งมีประโยชน์สำหรับการรองรับประเภทที่สังเกตได้ / รีแอกทีฟเมื่อ ใช้ร่วมกับ APIInvalidationTracker.createFlow()ของ RoomrawQuery: RoomRawQuery: (ไม่บังคับ) มีอินสแตนซ์ของการค้นหาในรันไทม์ ซึ่งช่วยให้ใช้การแปลง เช่น กลยุทธ์LIMIT/OFFSETที่ใช้งานโดยPagingSourceDaoReturnTypeConverterได้executeAndConvert: suspend () -> T: (บังคับ) ฟังก์ชันที่สร้างโดย Room ซึ่งจะดำเนินการค้นหาและแยกวิเคราะห์ผลลัพธ์เป็นออบเจ็กต์ข้อมูล
ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อกำหนดในการสร้างตัวแปลงประเภทการแสดงผล DAO
ได้ที่ KDoc ใน @DaoReturnTypeConverter
API