Room Database trong Android – hướng dẫn sử dụng chi tiết

11
Dịch vụ dạy kèm gia sư lập trình

Các bài trước mình đã hướng dẫn các bạn sử dụng SqliteRealm database. Tuy nhiên, vẫn còn một giải pháp thao tác với database cũng rất hay ho khác. Đó chính là Room database trong Android.

Vậy Room Database là gì? Cách sử dụng Room database như thế nào?

Chúng ta sẽ cùng nhau tìm hiểu thông qua một dự án ví dụ nhé.

Hướng dẫn sử dụng Room Persistence Library

#Giới thiệu Room database trong Android

Room database được phát triển và cải tiến từ sqlite. Room database giúp đơn giản hoá việc code,và giảm thiểu các công đoạn liên quan đến cơ sở dữ liệu.

Bản chất Room database là abstract layer gồm cơ sở dữ liệu chuẩn SQLite được Android thông qua.

Với 3 thành phần chính là: Database, DAO(Data Access Object) và entity. Mỗi thành phần đều có nhiệm vụ và chức năng riêng.

#Xây dựng ứng dụng sử dụng Room database trong Android

1. Cài đặt thư viện

Đầu tiên các bạn import thư viện vào file build.gradle

dependencies {
...
    implementation 'android.arch.persistence.room:runtime:' + rootProject.archRoomVersion;
...
}

2. Xây dựng layout

Ứng dụng demo có giao diện để khi nhập các thông tin và lưu xong data sẽ tự đọc ra và fill vào textview.

Giao diện của ứng dụng sẽ giống như bên dưới:

Hướng dẫn sử dụng Room database
Giao diện Demo ứng dụng sử dụng Room database

Toàn bộ code của layout như sau:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <EditText
        android:id="@+id/etName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="10dp"
        android:ems="10"

        android:hint="Employ Name"
        android:inputType="textPersonName|textCapWords"
        android:singleLine="true"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        tools:layout_editor_absoluteY="7dp" />

    <EditText
        android:id="@+id/etDesignation"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:ems="10"
        android:hint="Designation"
        android:inputType="textPersonName|textCapWords"
        android:singleLine="true"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        tools:layout_editor_absoluteY="75dp" />

    <Button
        android:background="@android:color/holo_blue_bright"
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="Save"
        app:layout_constraintTop_toBottomOf="@+id/editText2" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp">

        <TextView
            android:text="data"
            android:id="@+id/txt_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </ScrollView>

</LinearLayout>

3. Tạo cấu trúc rom database trong Android

Chúng ta sẽ chia phần tương tác với database thành 3 class:

  • Employee: Entity nơi định nghĩa bảng và trường của Database. Mỗi 1 Entity tương đương với 1 bảng trong Database.
  • EmployDao: Interface định nghĩa các câu truy vấn Database
  • AppDatabase: Class này extends từ RoomDatabase là nơi thao tác trực tiếp và thực hiện các truy vấn xuống Database.

Bây giờ mình sẽ hường dẫn các bạn tạo từng class một.

Lưu ý: Mỗi bảng cơ sở dữ liệu sẽ tương ứng với mỗi class được chú thích với @Entity

Đầu tiên các bạn tạo class Employee.

@Entity
public class Employee {
    @PrimaryKey(autoGenerate = true)
    public long employId;
    @ColumnInfo(name = "employ_name")
    public String name;
    public String designation;
}

Sau đó các bạn tạo interface để thực hiện truy vấn.

DAO là interface được chú thích với @Dao, nó đóng vai trò trung gian truy cập vào các đối tượng trong cơ sở dữ liệu và các bảng của nó.

Có bốn chú thích cụ thể cho các hoạt động cơ bản của DAO: @Insert, @Update, @Delete, and @Query.

@Dao
public interface EmployDao {
    @Insert(onConflict = REPLACE)
    void insertEmploy(Employee employee);

    @Insert(onConflict = IGNORE)
    void insertOrReplaceEmploy(Employee... employees);

    @Update(onConflict = REPLACE)
    void updateEmploy(Employee employee);

    @Query("DELETE FROM Employee")
    void deleteAll();

    @Query("SELECT * FROM Employee")
    public List<Employee> findAllEmploySync();
}

Và cuối cùng các bạn tạo AppDatabase.

Thành phần Database là một abstract class đã được chú giải bằng @Database. Nó extend RoomDatabase Class và trong đó định nghĩa một danh sách các Entities và các DAO.

@Database(entities = {Employee.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    private static AppDatabase INSTANCE;
    public abstract EmployDao employDao();
    public static AppDatabase getInMemoryDatabase(Context context) {
        if (INSTANCE == null) {
            INSTANCE = Room.inMemoryDatabaseBuilder(context.getApplicationContext(), AppDatabase.class)
                            // To simplify the codelab, allow queries on the main thread.
                            // Don't do this on a real app! See PersistenceBasicSample for an example.
                            .allowMainThreadQueries()
                            .build();
       }
        return INSTANCE;
    }
    public static void destroyInstance() {
        INSTANCE = null;
    }
}

4. Tạo các hàm trong  MainActivity để xử lý logic

Sau khi các bạn ánh xạ giao diện xong chúng ta bắt đầu code logic. Khi click vào button lưu mình sẽ gọi hàm insert.

Khi insert thành công thì đọc luôn database để hiển thị lên giao diện.

//Hàm xử lý click
Employee employee = new Employee();
employee.name = name;
employee.designation = designation;
mDb.employDao().insertEmploy(employee);
Toast.makeText(this, "Saved successfully", Toast.LENGTH_SHORT).show();
etName.setText("");
etDesignation.setText("");
etName.requestFocus();
populateEmployList();

Kết quả chúng ta thu được ứng dụng như demo bên dưới:

Demo ứng dụng sử dụng Room Persistence Library
Demo ứng dụng sử dụng Room Persistence Library

Tham khảo thêm về cách xử lý sự kiện trong android: Xử lý sự kiện trong Android (Event Listeners) bằng Kotlin

#Tạm kết

Như vậy, mình đã hướng dẫn các bạn từng bước sử dụng Room database trong Android. Với Room database, nhưng thao tác đọc, ghi database trở lên dễ dàng hơn bao giờ hết.

Bạn có thấy như vậy không? Toàn bộ source code của bài hướng dẫn, các bạn download ở đây nhé.

Hy vọng bài viết sẽ giúp các bạn làm được và hiểu chi tiết cấu trúc và làm các dự án nâng cao hơn sau này.

Dịch vụ phát triển ứng dụng mobile giá rẻ - chất lượng
Bài trướcUpload ảnh lên server bằng PHP dễ dàng nhất
Bài tiếp theoThực hiện A/B Testing để tối ưu hóa ngân sách Facebook Ads
Tên đầy đủ là Dương Anh Sơn. Tốt nghiệp ĐH Bách Khoa Hà Nội. Mình bắt đầu nghiệp coder khi mà ra trường chẳng xin được việc đúng chuyên ngành. Mình tin rằng chỉ có chia sẻ kiến thức mới là cách học tập nhanh nhất. Các bạn góp ý bài viết của mình bằng cách comment bên dưới nhé !

11
Bình luận. Cùng nhau thảo luận nhé!

avatar
  Theo dõi bình luận  
Mới nhất Cũ nhất Nhiều voted nhất
Thông báo
Phoi
Guest
Phoi

Cho em hỏi, làm sao kết nối được giữa bảng ng dùng và dữ liệu ng dùng nhập vậy ạ

Nguyễn thanh Phước
Guest
Nguyễn thanh Phước

sao mỗi lần tắt app rồi mở lại là nó mất hết dữ liệu vậy add?

Ngô Huy
Member
Ngô Huy

không chạy được rồi ad ơi