Sử dụng Room Persistence Library trong android

Giới thiệu

Trứớc khi bắt đầu sử dụng Room trong project android chúng ta hãy cùng tìm hiểu xem liệu Room là gì và các thành phần cơ bản của nó. Room là một Persistence Library được google giới thiệu trong sự kiện google I/O mới đây, nó là một abstract layer cung cấp cách thức truy câp thao tác với dữ liệu trong cơ sở dữ liệu SQLite. Nếu các bạn đã từng làm việc với Spring MVC và Hibenate thì chắc hẳn các bạn sẽ thấy nó rất quen thuộc khi tiếp cận với Room. Với Room việc thao tác với DB trở nên thật sự dễ dàng, bạn sẽ không cần phải viết những câu lệnh rất dài để thao tác với cơ sở dữ liệu nữa.

Room có 3 thành phần chính: Database, Entity và DAO

  1. Database: Được sử dụng để tạo một database bằng việc kế thừa từ class RoomDatabase
  2. Entity: Tướng ứng với một hàng trong bảng cơ sở dữ liệu.
  3. DAO: đây là thành phần chính của Room, nó chịu trách nhiệm định nghĩa các hàm thao tác với cơ sở dữ liệu

Sử dụng Room trong dự án

Chúng ta sẽ cùng nhau tạo một project demo đơn giản để thấy được việc sử dụng Room trong dự án android sẽ như thế nào, demo sẽ gồm 1 màn hình duy nhất cho phép thêm mới một user và xem danh sách user.

  1. Thêm thư viện cần thiết

Để sử dụng Room trong project chúng ta mở file build.gradle module app và thêm đoạn code sau

 /*Room*/
  compile "android.arch.persistence.room:runtime:1.0.0-alpha5"
  annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha5"

Trong ví dụ này mình sẽ sử dụng kotlin trên bản android studio 2.3.1 nên cần cài thêm plugin

apply plugin: 'kotlin-android'

dependencies {
  /*Kotlin*/
  compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
}
  1. Tạo lớp thực thể
@Entity(tableName = "user")
data class User(val firstName: String = "", val lastName: String = "") {
   @PrimaryKey(autoGenerate = true)
   val uid: Long = 0
}
  1. Tạo lớp DAO
@Dao interface UserDao {

   @Query("SELECT * FROM user")
   fun getAllUser(): Single<List<User>>
   
   @Insert
   fun insert(user: User)
   
   @Query("SELECT * FROM user WHERE firstName LIKE :first AND lastName LIKE :last LIMIT 1")
   User findByName(String first, String last);

}
  1. Tạo Room database

Tạo class AppDatabase

@Database(entities = arrayOf(User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
   abstract fun userDao(): UserDao
}

Setup database

class MyApp : Application() {

   companion object {
       var database: AppDatabase? = null
   }

   override fun onCreate() {
       super.onCreate()
       MyApp.database = Room.databaseBuilder(this, AppDatabase::class.java, "app-database").build()
   }
}

Tham khảo: https://developer.android.com/topic/libraries/architecture/room.html https://kotlinlang.org/docs/tutorials/kotlin-android.html