Tin tức về sản phẩm

Room 3.0 – Hiện đại hoá Room

Đọc trong 4 phút
Daniel Santiago Rivera
Kỹ sư phần mềm

Phiên bản alpha đầu tiên của Room 3.0 đã được phát hành! Room 3.0 là một phiên bản chính có thay đổi làm gián đoạn của thư viện, tập trung vào Kotlin Multiplatform (KMP) và bổ sung khả năng hỗ trợ JavaScript và WebAssembly (WASM) ngoài khả năng hỗ trợ máy tính Android, iOS và JVM hiện có. 

Trong blog này, chúng tôi sẽ trình bày những thay đổi có thể gây lỗi, lý do đằng sau Room 3.0 và nhiều việc bạn có thể làm để di chuyển từ Room 2.0.

Thay đổi có thể gây lỗi

Room 3.0 có những thay đổi về API có thể gây lỗi sau đây: 

  • Ngừng hỗ trợ API SupportSQLite: Room 3.0 được hỗ trợ đầy đủ bởi API trình điều khiển androidx.sqlite. Các API SQLiteDriver tương thích với KMP và việc xoá phần phụ thuộc của Room trên API của Android sẽ đơn giản hoá giao diện API cho Android vì tránh được việc có 2 phần phụ trợ có thể có.
  • Không còn tạo mã Java: Room 3.0 chỉ tạo mã Kotlin. Điều này phù hợp với mô hình ưu tiên Kotlin đang phát triển, đồng thời đơn giản hoá cơ sở mã và quy trình phát triển, giúp các lần lặp lại diễn ra nhanh hơn.
  • Tập trung vào KSP: Chúng tôi cũng sẽ ngừng hỗ trợ quy trình xử lý chú giải (AP) Java và KAPT. Room 3.0 chỉ là một trình xử lý KSP (Kotlin Symbol Processing), cho phép xử lý tốt hơn các cơ sở mã Kotlin mà không bị giới hạn bởi ngôn ngữ Java.
  • Ưu tiên coroutine: Room 3.0 sử dụng coroutine Kotlin, giúp các API của Room ưu tiên coroutine. Coroutine là khung không đồng bộ tương thích với KMP và việc làm cho Room trở thành không đồng bộ theo bản chất là một yêu cầu quan trọng để hỗ trợ các nền tảng web.

Một gói mới

Để ngăn các vấn đề về khả năng tương thích với các phương thức triển khai Room 2.x hiện có và đối với các thư viện có phần phụ thuộc bắc cầu vào Room (ví dụ: WorkManager), Room 3.0 nằm trong một gói mới, tức là gói này cũng có một nhóm maven và mã nhận dạng cấu phần phần mềm mới. Ví dụ: androidx.room:room-runtime đã trở thành androidx.room3:room3-runtime và các lớp như androidx.room.RoomDatabase hiện sẽ nằm tại androidx.room3.RoomDatabase.

Kotlin và Coroutine là ưu tiên hàng đầu

Không còn tạo mã Java nữa, Room 3.0 cũng yêu cầu KSP và trình biên dịch Kotlin ngay cả khi cơ sở mã tương tác với Room ở Java. Bạn nên có một dự án có nhiều mô-đun, trong đó việc sử dụng Room được tập trung và Trình bổ trợ Kotlin cho Gradle cũng như KSP có thể được áp dụng mà không ảnh hưởng đến phần còn lại của cơ sở mã.

Room 3.0 cũng yêu cầu Coroutines và cụ thể hơn là các hàm DAO phải tạm ngưng trừ phi chúng trả về một loại phản ứng, chẳng hạn như Flow. Room 3.0 không cho phép chặn các hàm DAO. Hãy xem Tài liệu về coroutine trên Android để biết cách bắt đầu tích hợp Coroutine vào ứng dụng của bạn.

Di chuyển sang API SQLiteDriver

Khi chuyển từ SupportSQLite, các ứng dụng sẽ cần di chuyển sang API SQLiteDriver. Quá trình di chuyển này là cần thiết để khai thác toàn bộ lợi ích của Room 3.0, bao gồm cả việc cho phép sử dụng thư viện SQLite đi kèm thông qua BundledSQLiteDriver. Bạn có thể bắt đầu di chuyển sang các API trình điều khiển ngay hôm nay bằng Room 2.7.0 trở lên. Bạn nên tránh sử dụng SupportSQLite thêm nữa. Nếu bạn di chuyển các hoạt động tích hợp Room sang API SQLiteDriver, thì quá trình chuyển đổi sang Room 3.0 sẽ dễ dàng hơn vì thay đổi gói chủ yếu liên quan đến việc cập nhật các tham chiếu biểu tượng (nhập) và có thể chỉ yêu cầu một số thay đổi nhỏ đối với các vị trí gọi.

Để biết thông tin tổng quan ngắn gọn về các API SQLiteDriver, hãy xem tài liệu về các API SQLiteDriver.

Để biết thêm thông tin về cách di chuyển Room để sử dụng các API SQLiteDriver, hãy xem tài liệu chính thức về cách di chuyển từ SupportSQLite.

Trình bao bọc SupportSQLite của Room

Chúng tôi hiểu rằng việc xoá hoàn toàn SupportSQLite có thể không thực hiện được ngay lập tức đối với tất cả các dự án. Để đơn giản hoá quá trình chuyển đổi này, Room 2.8.0 (phiên bản mới nhất của dòng Room 2.0) đã giới thiệu một cấu phần phần mềm mới có tên là androidx.room:room-sqlite-wrapper. Cấu phần phần mềm này cung cấp một API tương thích cho phép bạn chuyển đổi một RoomDatabase thành một SupportSQLiteDatabase, ngay cả khi các API SupportSQLite trong cơ sở dữ liệu đã bị vô hiệu hoá do đã cài đặt SQLiteDriver. Điều này cung cấp một cầu nối tạm thời cho những nhà phát triển cần thêm thời gian để di chuyển hoàn toàn cơ sở mã của họ. Cấu phần phần mềm này vẫn tồn tại trong Room 3.0 dưới dạng androidx.room3:room3-sqlite-wrapper để cho phép di chuyển sang Room 3.0 trong khi vẫn hỗ trợ việc sử dụng SupportSQLite quan trọng.

Ví dụ: các lệnh gọi roomDatabase.openHelper.writableDatabase có thể được thay thế bằng roomDatabase.getSupportWrapper() và một trình bao bọc sẽ được cung cấp ngay cả khi setDriver() được gọi trên trình tạo của Room.

Để biết thêm thông tin chi tiết, hãy xem tài liệu về trình bao bọc room-sqlite.

Hỗ trợ web cho Room và SQLite

Hỗ trợ các mục tiêu Kotlin Multiplatform là JS và WasmJS, đồng thời mang đến một số thay đổi quan trọng nhất về API. Cụ thể, nhiều API trong Room 3.0 là các hàm tạm ngưng vì khả năng hỗ trợ thích hợp cho bộ nhớ web là không đồng bộ. API SQLiteDriver cũng đã được cập nhật để hỗ trợ Web và một trình điều khiển không đồng bộ web mới có trong androidx.sqlite:sqlite-web. Đây là một trình điều khiển dựa trên Web Worker, cho phép duy trì cơ sở dữ liệu trong Hệ thống tệp riêng tư gốc (OPFS).

Để biết thêm thông tin chi tiết về cách thiết lập Room cho Web, hãy xem Ghi chú phát hành Room 3.0.

Loại dữ liệu trả về DAO tuỳ chỉnh

Room 3.0 giới thiệu khả năng thêm các hoạt động tích hợp tuỳ chỉnh vào Room, tương tự như RxJava và Paging. Thông qua một API chú thích mới có tên là @DaoReturnTypeConverter, bạn có thể tạo chế độ tích hợp của riêng mình để mã do Room tạo có thể truy cập được trong thời gian chạy. Điều này cho phép các hàm @Dao có các kiểu trả về tuỳ chỉnh mà không cần phải đợi nhóm Room thêm chế độ hỗ trợ. Các hoạt động tích hợp hiện có sẽ được di chuyển để sử dụng chức năng này. Do đó, những người dựa vào chức năng này sẽ phải thêm các bộ chuyển đổi vào định nghĩa @Database hoặc @Dao.

Ví dụ: Trình chuyển đổi phân trang sẽ nằm trong cấu phần phần mềm androidx.room3:room3-paging và có tên là PagingSourceDaoReturnTypeConverter. Trong khi đó, đối với LiveData, bộ chuyển đổi nằm trong androidx.room3:room3-livedata và được gọi là LiveDataDaoReturnTypeConverter.

Để biết thêm thông tin chi tiết, hãy xem phần Trình chuyển đổi loại trả về DAO trong ghi chú phát hành Room 3.0.

Chế độ bảo trì của Room 2.x

Vì quá trình phát triển Room sẽ tập trung vào Room 3, nên phiên bản Room 2.x hiện tại sẽ chuyển sang chế độ bảo trì. Điều này có nghĩa là sẽ không có tính năng chính nào được phát triển, nhưng các bản phát hành bản vá (2.8.1, 2.8.2, v.v.) vẫn sẽ được phát hành cùng với các bản sửa lỗi và bản cập nhật phần phụ thuộc. Nhóm cam kết thực hiện công việc này cho đến khi Room 3 ổn định.

Những chỉnh sửa cuối

Chúng tôi vô cùng hào hứng với tiềm năng của Room 3.0 và những cơ hội mà phiên bản này mang lại cho hệ sinh thái Kotlin. Hãy tiếp tục theo dõi để biết những thông tin cập nhật khác trong hành trình này!

Tác giả:

Tiếp tục đọc