Google Giới Thiệu Room 3.0: Thư Viện Persistence Đa Nền Tảng, Ưu Tiên Kotlin Và Hỗ Trợ Async
Google đã tung ra Room 3.0, một bản cập nhật lớn cho thư viện lưu trữ dữ liệu của Android, mang đến những thay đổi quan trọng về kiến trúc. Phiên bản mới này tập trung hiện đại hóa lớp lưu trữ dựa trên Kotlin Multiplatform (KMP) và mở rộng khả năng hỗ trợ sang cả JavaScript lẫn WebAssembly.

Google vừa chính thức giới thiệu Room 3.0, một bản cập nhật mang tính bước ngoặt cho thư viện lưu trữ dữ liệu (persistence library) trên Android. Bản phát hành này không chỉ mang đến những thay đổi lớn (breaking changes) mà còn đặt mục tiêu hiện đại hóa toàn bộ lớp lưu trữ dữ liệu của Android xoay quanh Kotlin Multiplatform (KMP).
Điểm nổi bật nhất của Room 3.0 là việc mở rộng hỗ trợ sang nhiều nền tảng khác nhau, bao gồm cả JavaScript và WebAssembly, đồng thời chuyển đổi hoàn toàn sang mô hình ưu tiên Kotlin và xử lý bất đồng bộ (async).
Ưu tiên tuyệt đối cho Kotlin và KSP
Thay đổi lớn đầu tiên và dễ nhận thấy nhất là Room 3.0 sẽ không còn tạo mã Java. Thay vào đó, thư viện này chỉ tạo ra mã Kotlin. Theo đội ngũ phát triển, việc này giúp đơn giản hóa đáng kể cả cơ sở mã lẫn quy trình phát triển, cho phép các lần lặp (iteration) diễn ra nhanh hơn.
Cùng với việc ngừng tạo mã Java, Room 3.0 cũng loại bỏ hoàn toàn sự hỗ trợ cho Xử lý chú thích Java (Java Annotation Processing - AP) và KAPT. Giờ đây, Room 3.0 hoạt động độc quyền như một bộ xử lý KSP (Kotlin Symbol Processing).
Điều này cho phép xử lý tốt hơn các cơ sở mã viết bằng Kotlin mà không bị giới hạn bởi ngôn ngữ Java. Hệ quả là Room 3.0 yêu cầu bắt buộc phải sử dụng KSP và trình biên dịch Kotlin, ngay cả đối với các dự án chỉ sử dụng mã Java. Trong trường hợp này, Google khuyến nghị các nhà phát triển nên cô lập việc sử dụng Room trong một module chuyên biệt để áp dụng "Kotlin Gradle Plugin và KSP" mà không ảnh hưởng đến phần còn lại của dự án.
Thay đổi kiến trúc và SQLite
Về mặt kiến trúc, Room 3.0 thực hiện hai thay đổi mang tính đột phá: loại bỏ API cơ sở dữ liệu SQLite gốc của Android (SupportSQLite) và áp dụng mô hình ưu tiên coroutine (coroutine-first).
Thay vì dựa vào các API chỉ dành riêng cho Android, Room 3.0 sử dụng các API driver androidx.sqlite tương thích với KMP. Việc này giúp đơn giản hóa quá trình phát triển bằng cách loại bỏ nhu cầu bảo trì hai backend SQL cùng lúc.
Việc áp dụng Kotlin coroutines cho phép các hoạt động hoàn toàn bất đồng bộ. Kết quả là, tất cả các hàm DAO được thư viện tạo ra — chẳng hạn như chèn, xóa hoặc truy vấn dữ liệu — đều được định nghĩa là suspend. Ngoài ra, chúng cũng có thể trả về một kiểu phản ứng (reactive type) sử dụng Kotlin Flow, có khả năng phát ra nhiều giá trị một cách tuần tự.
Hỗ trợ nền tảng Web và công cụ di chuyển
Để giúp các nhà phát triển dễ dàng chuyển đổi sang Room 3.0 và loại bỏ API SQL gốc của Android, Room 2.8.0 đã giới thiệu androidx.room:room-sqlite-wrapper. Artifact này cung cấp một lớp tương thích cho phép chuyển đổi RoomDatabase thành SupportSQLiteDatabase.
Đây được coi là một cây cầu tạm thời dành cho những nhà phát triển cần thêm thời gian để di chuyển toàn bộ cơ sở mã của mình. Trong Room 3.0, artifact này tiếp tục tồn tại dưới tên androidx.room3:room3-sqlite-wrapper để hỗ trợ việc di chuyển trong khi vẫn duy trì các sử dụng SupportSQLite quan trọng.
Như đã đề cập, Room 3.0 cũng mở rộng hỗ trợ nền tảng sang JavaScript và WasmJS. Điều này dẫn đến một số thay đổi lớn, vì nhiều hàm trong Room 3.0 giờ đây là các hàm suspend để hỗ trợ đúng cách cho bộ nhớ web, vốn có tính chất bất đồng bộ nội tại.
Các API SQLiteDriver cũng đã được cập nhật để hỗ trợ Web và một driver web bất đồng bộ mới đã có mặt trong androidx.sqlite:sqlite-web. Đây là driver dựa trên Web Worker, cho phép lưu trữ cơ sở dữ liệu trong Hệ thống tệp riêng tư của nguồn gốc (Origin private file system - OPFS).
Với việc ra mắt Room 3.0, Room 2 chính thức bước vào chế độ bảo trì. Phiên bản này sẽ chỉ nhận các bản cập nhật vá lỗi trên nền tảng 2.8.0, giới hạn ở việc sửa lỗi và cập nhật các phụ thuộc, cho đến khi Room 3.0 đạt được trạng thái ổn định hoàn toàn.



