19/11/2018, 19:42

Android Room Persistence Library

1. Giới thiệu Room là persistence library cung cấp một abstraction layer trên SQLite cho phép truy cập dễ dàng hơn và khai thác được hết sức mạnh của SQLite. Ba thành phần chính trong Room: Database : Chứa database holder và phục vụ như điểm truy cập chính cho các kết nối cơ bản. Class sẽ ...

1. Giới thiệu

Room là persistence library cung cấp một abstraction layer trên SQLite cho phép truy cập dễ dàng hơn và khai thác được hết sức mạnh của SQLite.

Ba thành phần chính trong Room:

  • Database: Chứa database holder và phục vụ như điểm truy cập chính cho các kết nối cơ bản. Class sẽ được annotated bằng @Database và thỏa các điều kiện sau:
    • Abstract class và extends từ RoomDatabase.
    • Include danh sách các entities được annotated bằng @Entity.
    • Chứa abstract method không có các arguments và trả về class được annotated bằng @Dao. Ở runtime, chúng ta có thể có một instance của Database bằng việc gọi Room.databaseBuilder() hoặc Room.inMemoryDatabaseBuilder().
  • Entity: Đại diện cho một table trong database.
  • DAO: Chứa các method được dùng để truy cập vào database.

Room architecture diagram

2. Dependencies

dependencies {
    def room_version = "1.1.1"

    implementation "android.arch.persistence.room:runtime:$room_version"
    annotationProcessor "android.arch.persistence.room:compiler:$room_version" // use kapt for Kotlin

    // optional - RxJava support for Room
    implementation "android.arch.persistence.room:rxjava2:$room_version"

    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation "android.arch.persistence.room:guava:$room_version"

    // Test helpers
    testImplementation "android.arch.persistence.room:testing:$room_version"
}

3. Entity

@Entity(tableName = "products")
public class ProductEntity implements Product {
    @PrimaryKey
    private int id;
    private String name;
    private String description;
    private int price;

    @Override
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public ProductEntity() {
    }

    @Ignore
    public ProductEntity(int id, String name, String description, int price) {
        this.id = id;
        this.name = name;
        this.description = description;
        this.price = price;
    }

    public ProductEntity(Product product) {
        this.id = product.getId();
        this.name = product.getName();
        this.description = product.getDescription();
        this.price = product.getPrice();
    }
}
  • @PrimaryKey: Thể hiện rằng field id là một khóa chính của table.
  • @Ignore: Room sẽ bỏ qua những method hoặc field được annotated bằng @Ignore

Xem thêm: https://developer.android.com/training/data-storage/room/defining-data

4. Dao

@Dao
public interface ProductDao {
    @Query("SELECT * FROM products")
    LiveData<List<ProductEntity>> loadAllProducts();

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertAll(List<ProductEntity> products);

    @Query("select * from products where id = :productId")
    LiveData<ProductEntity> loadProduct(int productId);

    @Query("select * from products where id = :productId")
    ProductEntity loadProductSync(int productId);

    @Query("SELECT products.* FROM products JOIN productsFts ON (products.id = productsFts.rowid) "
        + "WHERE productsFts MATCH :query")
    LiveData<List<ProductEntity>> searchAllProducts(String query);
}
  • @Insert: Room tạo ra một implementation để inserts tất cả parameters vào database trong một single transaction.
  • @Query: Là annotation chính được dùng trong DAO classes. Nó cho phép thực hiện read/write vào database.

Xem thêm: https://developer.android.com/training/data-storage/room/accessing-data

5. Database

@Database(entities = {ProductEntity.class, version = 2)
public abstract class AppDatabase extends RoomDatabase {

    private static AppDatabase sInstance;

    @VisibleForTesting
    public static final String DATABASE_NAME = "basic-sample-db";

    public abstract ProductDao productDao();

    private final MutableLiveData<Boolean> mIsDatabaseCreated = new MutableLiveData<>();

    public static AppDatabase getInstance(final Context context, final AppExecutors executors) {
        if (sInstance == null) {
            synchronized (AppDatabase.class) {
                if (sInstance == null) {
                    sInstance = buildDatabase(context.getApplicationContext(), executors);
                    sInstance.updateDatabaseCreated(context.getApplicationContext());
                }
            }
        }
        return sInstance;
    }
}

Tham khảo

  1. https://developer.android.com/training/data-storage/room/
  2. https://github.com/googlesamples/android-architecture-components/tree/master/BasicSample
0