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

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

4 phút đọc
Xem hồ sơ của Daniel Santiago Rivera
Daniel Santiago Rivera Kỹ sư phần mềm

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 có thay đổi có thể gây lỗi lớn của thư viện, tập trung vào Kotlin Multiplatform (KMP) và bổ sung tính năng hỗ trợ cho JavaScript và WebAssembly (WASM) bên cạnh tính năng hỗ trợ hiện có cho Android, iOS và máy tính JVM. 

Trong bài đăng này, chúng tôi sẽ trình bày những thay đổi có thể gây lỗi, lý do ra đời của 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 bao gồm các thay đổi có thể gây lỗi API sau đây: 

  • Ngừng sử dụng 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 vào API của Android sẽ đơn giản hoá giao diện API cho Android vì việc này giúp tránh có hai phần phụ trợ có thể xảy ra.
  • 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á toàn bộ mã nguồn và quy trình phát triển, giúp lặp lại nhanh hơn.
  • Tập trung vào KSP: Chúng tôi cũng sẽ ngừng hỗ trợ Xử lý chú thích Java (AP) 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 toàn bộ mã nguồn 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 không đồng bộ theo mặc định là một yêu cầu quan trọng để hỗ trợ các nền tảng web.

Gói mới

Để ngăn chặ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ã nhóm và mã cấu phần phần mềm maven 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.

Ưu tiên Kotlin và Coroutine

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

Room 3.0 cũng yêu cầu Coroutine 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. Xem tài liệu về Coroutine trên Android để bắt đầu tích hợp Coroutine vào ứng dụng của bạn.

Di chuyển sang API SQLiteDriver

Khi ngừng sử dụng SupportSQLite, các ứng dụng sẽ cần di chuyển sang API SQLiteDriver. Quá trình di chuyển này rất cần thiết để tận dụng 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 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 về gói chủ yếu liên quan đến việc cập nhật tệp tham chiếu biểu tượng (lệnh nhập) và có thể yêu cầu thay đổi tối thiểu đối với các trang web gọi.

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

Để biết thêm thông tin chi tiết về cách di chuyển Room để sử dụng 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 khả thi ngay lập tức đối với một số dự án. Để quá trình chuyển đổi này diễn ra dễ dàng hơn, Room 2.8.0 (phiên bản mới nhất của dòng Room 2.0) đã ra mắt một cấu phần phần mềm mới có tên là androidx.room:room-sqlite-wrapper. Phần mềm này cung cấp một API tương thích cho phép bạn chuyển đổi RoomDatabase thành SupportSQLiteDatabase, ngay cả khi các API SupportSQLite trong cơ sở dữ liệu đã bị tắt 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 toàn bộ mã nguồn của họ. Cấu phần phần mềm này tiếp tục 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ụ: bạn có thể thay thế lệnh gọi roomDatabase.openHelper.writableDatabase 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, hãy xem tài liệu về room-sqlite-wrapper.

Hỗ trợ Room và SQLite trên web

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à hàm tạm ngưng vì tính năng hỗ trợ thích hợp cho bộ nhớ web là không đồng bộ. Các 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ộ mới cho web hiện có trong androidx.sqlite:sqlite-web. Đây là một trình điều khiển dựa trên Trình chạy web 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.

Kiểu dữ liệu trả về tuỳ chỉnh của DAO

Room 3.0 ra mắt khả năng thêm các thành phần 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 riêng để 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ó kiểu dữ liệu trả về tuỳ chỉnh mà không cần đợi nhóm Room thêm tính năng hỗ trợ. Các thành phần tích hợp hiện có đượ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ẽ cần thêm trình 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 gọi là PagingSourceDaoReturnTypeConverter. Trong khi đó, đối với LiveData, trình chuyển đổi nằm trong androidx.room3:room3-livedata và được gọi là LiveDataDaoReturnTypeConverter.

Để biết thêm thông tin, hãy xem phần Bộ chuyển đổi kiểu dữ liệu trả về của DAO trong ghi chú phát hành của 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 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 hoạt động ổn định.

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

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

Tác giả:
Tiếp tục đọc