Di chuyển từ SQLite sang Room

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:

  1. 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ính tableName để chỉ ra bảng kết quả phải có tên khác với tên lớp.
  2. Chú thích trường khoá chính bằng @PrimaryKey.
  3. 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ính name thành tên cột chính xác.
  4. 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.
  5. 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:

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:

Blog