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 hiện đang triển khai SQLite không thuộc Room, đọc trang này để tìm hiểu cách di chuyển ứng dụng của bạn để sử dụng Room. Nếu Room là triển khai SQLite đầu tiên đang được sử dụng trong ứng dụng của bạn, xem nội dung Lưu dữ liệu trong cơ sở dữ liệu cục bộ bằng cách sử dụng Room để biết thông tin cơ bản về cách sử dụng.
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. Xem nội dung Di chuyển dần để tìm hiểu chiến lược về di chuyển dần.
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. Xem nội dung Thiết lập để biết các phần phụ thuộc mới nhất trong Room.
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ị 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 trường đại diện cho các cột trong bảng đó. Thực hiện các bước sau để cập nhật lớp mô hình hiện thời thành thực thể Room:
- Chú thích khai báo lớp bằng
@Entity
để cho biết đây là 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ú thích trường 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 trường tương ứng, chú thích trường bằng
@ColumnInfo
và thiết lập thuộc tínhname
thành tên cột chính xác. - Nếu lớp có những trường mà bạn không muốn lưu trữ trong cơ sở dữ liệu, chú thích những trường đó 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 phương thức hàm khởi tạo, thì chỉ ra 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
.
Kotlin
@Entity(tableName = "users") data class User( @PrimaryKey @ColumnInfo(name = "userid") val mId: String, @ColumnInfo(name = "username") val mUserName: String?, @ColumnInfo(name = "last_update") val mDate: Date?, )
Java
@Entity(tableName = "users") public class User { @PrimaryKey @ColumnInfo(name = "userid") private String mId; @ColumnInfo(name = "username") private String mUserName; @ColumnInfo(name = "last_update") private Date mDate; @Ignore public User(String userName) { mId = UUID.randomUUID().toString(); mUserName = userName; mDate = new Date(System.currentTimeMillis()); } public User(String id, String userName, Date date) { this.mId = id; this.mUserName = userName; this.mDate = date; } }
Tạo DAO
Room sử dụng đối tượng truy cập dữ liệu (DAO) để xác định các phương thức truy cập cơ sở dữ liệu. Làm theo hướng dẫn trong Truy cập dữ liệu bằng DAO Room để thay thế các phương thức truy vấn hiện có của bạn 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 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.
Kotlin
@Database(entities = [User::class], version = 2) @TypeConverters(DateConverter::class) abstract class UsersDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
Java
@Database(entities = {User.class}, version = 2) @TypeConverters(DateConverter.class) public abstract class UsersDatabase extends RoomDatabase { public abstract 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
để chỉ ra đường dẫn di chuyển khiến cho Room giữ lại dữ liệu hiện có trong cơ sở dữ liệu.
Chừng nào giản đồ cơ sở dữ liệu còn không thay đổi, thì đây có thể là một triển khai rỗng.
Kotlin
val MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { // Empty implementation, because the schema isn't changing. } }
Java
static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { // Empty implementation, because the schema isn't changing. } };
Để tìm hiểu thêm về đường dẫn di chuyển cơ sở dữ liệu trong Room, xem nội dung Di chuyển cơ sở dữ liệu của bạn.
Cập nhật bản sao cơ sở dữ liệu
Sau khi đã xác định 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 bản sao cơ sở dữ liệu với đường dẫn di chuyển được áp dụng:
Kotlin
val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "database-name" ) .addMigrations(MIGRATION_1_2).build()
Java
db = Room.databaseBuilder( context.getApplicationContext(), UsersDatabase.class, "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ử Di chuyển để kiểm thử việc 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 phương thức 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 phương thức truy vấn của bạn vào DAO sau đó. Bạn có thể thực hiện việc này bằng cách thay lớp trình trợ giúp cơ sở dữ liệu tuỳ chỉnh bằng đối tượng SupportSQLiteOpenHelper
nhận được từ RoomDatabase.getOpenHelper()
Tài nguyên khác
Để tìm hiểu thêm về việc di chuyển từ SQLite sang Room, xem thêm các tài nguyên sau: