Thư viện lưu trữ của Room mang lại nhiều lợi ích so với việc sử dụng trực tiếp API SQLite:
- Xác minh thời gian biên dịch của truy vấn SQL
- Chú thích tiện lợi giúp giảm thiểu mã nguyên mẫu lặp lại, dễ mắc lỗi
- Hợp lý hoá đường dẫn di chuyển cơ sở dữ liệu
Nếu ứng dụng của bạn có một hoạt động triển khai SQLite không thuộc Room, hãy đọc trang này để tìm hiểu cách di chuyển sang Room. Nếu Room là phương thức triển khai SQLite đầu tiên trong ứng dụng của bạn, hãy xem phần Lưu dữ liệu trong cơ sở dữ liệu cục bộ bằng Room để biết cách sử dụng cơ bản.
Các bước di chuyển
Thực hiện các bước sau để di chuyển hoạt động triển khai SQLite của bạn sang Room. Nếu việc triển khai SQLite sử dụng cơ sở dữ liệu lớn hoặc truy vấn phức tạp, bạn có thể di chuyển dần sang Room. Để biết thêm thông tin về chiến lược di chuyển gia tăng, hãy xem phần Di chuyển gia tăng.
Cập nhật phần phụ thuộc
Để sử dụng Room trong ứng dụng, bạn phải đưa các phần phụ thuộc thích hợp vào tệp build.gradle của ứng dụng. Để biết thêm thông tin về các phần phụ thuộc của Room, hãy xem phần Thiết lập.
Cập nhật lớp mô hình thành thực thể dữ liệu
Room sử dụng thực thể dữ liệu để biểu thị các bảng trong cơ sở dữ liệu. Mỗi lớp thực thể đại diện cho một bảng và có các thuộc tính đại diện cho các cột trong bảng đó. Hãy làm theo các bước sau để cập nhật các lớp mô hình hiện có thành thực thể Room:
- Chú thích khai báo lớp bằng
@Entityđể cho biết đây là một thực thể Room. Bạn có thể tuỳ ý sử dụng thuộc tínhtableNameđể chỉ ra bảng kết quả phải có tên khác với tên lớp. - Chú giải thuộc tính khoá chính bằng
@PrimaryKey. - Nếu bất kỳ cột nào trong bảng kết quả phải có tên khác với tên của thuộc tính tương ứng, hãy chú thích thuộc tính bằng
@ColumnInfovà thiết lập thuộc tínhnamethành tên cột chính xác. - Nếu lớp có những thuộc tính mà bạn không muốn lưu trữ trong cơ sở dữ liệu, hãy chú thích những thuộc tính đó bằng
@Ignoređể cho biết Room sẽ không tạo cột cho chúng trong bảng tương ứng. - Nếu lớp có nhiều hàm khởi tạo, hãy cho biết Room nên sử dụng hàm khởi tạo nào bằng cách chú thích tất cả các hàm khởi tạo khác bằng
@Ignore.
@Entity(tableName = "users") data class User( @PrimaryKey @ColumnInfo(name = "userid") val id: String, @ColumnInfo(name = "username") val userName: String?, @ColumnInfo(name = "last_update") val date: Date?, )
Tạo DAO
Room sử dụng đối tượng truy cập dữ liệu (DAO) để xác định các hàm truy cập cơ sở dữ liệu. Làm theo hướng dẫn trong bài viết Truy cập dữ liệu bằng DAO của Room để thay thế các hàm truy vấn hiện có bằng DAO.
Tạo lớp cơ sở dữ liệu
Việc triển khai Room sử dụng lớp cơ sở dữ liệu để quản lý một phiên bản của cơ sở dữ liệu. Lớp cơ sở dữ liệu của bạn phải mở rộng RoomDatabase và tham chiếu tất cả các thực thể và DAO mà bạn đã xác định.
@Database(entities = [User::class], version = 2) @ColumnTypeConverters(DateConverter::class) abstract class UsersDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
Xác định đường dẫn di chuyển
Do số phiên bản cơ sở dữ liệu đang thay đổi, nên bạn phải xác định một đối tượng Migration để giữ lại dữ liệu hiện có trong cơ sở dữ liệu. Nếu giản đồ cơ sở dữ liệu không thay đổi, thì quá trình di chuyển này có thể trống.
val MIGRATION_1_2 = object : Migration(1, 2) { override suspend fun migrate(connection: SQLiteConnection) { // Empty implementation, because the schema isn't changing. } }
Để biết thêm thông tin về đường dẫn di chuyển cơ sở dữ liệu trong Room, hãy xem bài viết Di chuyển cơ sở dữ liệu.
Cập nhật bản sao cơ sở dữ liệu
Sau khi xác định một lớp cơ sở dữ liệu và đường dẫn di chuyển, bạn có thể sử dụng Room.databaseBuilder để tạo một thực thể cơ sở dữ liệu với đường dẫn di chuyển được áp dụng:
val db = Room.databaseBuilder<UsersDatabase>(applicationContext, "database-name") .addMigrations(MIGRATION_1_2) .build()
Kiểm thử kết quả triển khai
Đảm bảo bạn kiểm thử cách triển khai Room mới:
- Làm theo hướng dẫn trong Kiểm thử hoạt động di chuyển để kiểm thử hoạt động di chuyển cơ sở dữ liệu.
- Làm theo hướng dẫn trong Kiểm thử cơ sở dữ liệu để kiểm thử các hàm DAO.
Di chuyển dần dần
Nếu ứng dụng của bạn sử dụng một cơ sở dữ liệu lớn và phức tạp, thì việc di chuyển ứng dụng sang Room cùng một lúc là không thể. Thay vào đó, bạn có thể tuỳ ý triển khai các thực thể dữ liệu và cơ sở dữ liệu Room như bước đầu tiên, rồi di chuyển các hàm truy vấn của bạn vào DAO sau đó.
Để triển khai quy trình di chuyển gia tăng, hãy lấy trình bao bọc tương thích SupportSQLiteDatabase bằng cách sử dụng hàm tiện ích roomDatabase.getSupportWrapper từ cấu phần phần mềm androidx.room3:room3-sqlite-wrapper. Trình bao bọc này cho phép bạn thực thi các truy vấn SQL trực tiếp theo kiểu Android trên cơ sở dữ liệu do Room quản lý bằng cách sử dụng các API SQLite của Android:
// Get SupportSQLiteDatabase wrapper val legacyDb = roomDatabase.getSupportWrapper() legacyDb.execSQL("INSERT INTO users ...")