Room cung cấp một lớp trừu tượng trên SQLite để cho phép truy cập dữ liệu khi khai thác sức mạnh của SQLite.
Thư viện giúp bạn tạo bộ nhớ cache dữ liệu ứng dụng của mình trên thiết bị đang chạy ứng dụng của bạn. Bộ nhớ cache này cho phép người dùng xem một bản sao thông tin chính xác trong ứng dụng của bạn bất kể người dùng có kết nối internet.

Adding Components to your Project

Add the Google Maven repository

Android Studio không cấu hình để truy cập kho này theo mặc định.
Để thêm nó vào project của bạn, mở build.gradle cho dự án và thêm dòng bên dưới:

allprojects {
    repositories {
        jcenter()
        maven { url 'https://maven.google.com' }
    }
}

Add Architecture Components

Mở build.gradle của module app và thêm dependencies:

implementation "android.arch.persistence.room:runtime:1.0.0
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"

Saving Data Using the Room Persistence Library

Có 3 thành phần chính trong Room:

  1. Database: Bao gồm chủ sở hữu database và đóng vai trò điểm truy cập chính cho kết nối với dữ liệu liên quan.
    Class sử dụng annotation @Database phải thỏa mãn các điều kiện sau:
  • Là một abstract class được extend từ RoomDatabase.
  • Bao gồm list các entity được liên kết với database với annotation.
  • Bao gồm một abstract method ko có tham số truyền vào và @Daotrả về class có annotation @Dao
    Khi chạy, bạn có thể có được một instance của database bằng cách gọi Room.databaseBuilder() hoặc Room.inMemoryDatabaseBuilder().
  1. Entity: Biểu diễn table bên trong cơ sở dữ liệu.
  2. DAO: Bao gồm các method được sử dụng để truy cập cơ sở dữ liệu.

    Diagram kiến trúc của Room

Quick Sample Database

  • Entity Class:
    User.java
@Entity
public class User {
    @PrimaryKey
    private int uid;

    @ColumnInfo(name = "first_name")
    private String firstName;

    @ColumnInfo(name = "last_name")
    private String lastName;
}
  • DAO Class:
    UserDao.java
@Dao
public interface UserDao {
    @Query("SELECT * FROM user")
    List<User> getAll();

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    List<User> loadAllByIds(int[] userIds);

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND "
           + "last_name LIKE :last LIMIT 1")
    User findByName(String first, String last);

    @Insert
    void insertAll(User... users);

    @Delete
    void delete(User user);
}
  • Database Class:
    AppDatabase.java
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

Sau khi tạo ra những file trên, bạn có thể get một instance của database được tạo ra bằng dòng dưới đây

AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").build();

Note: Bạn nên khởi tạo AppDatabase instance theo singleton pattern

Bạn có thể tìm hiểu thêm nâng cao hơn về Room ở https://developer.android.com/training/data-storage/room/defining-data.html