📝 Giới Thiệu
Trong phát triển ứng dụng Android, Room, LiveData, và ViewModel là những công nghệ giúp xây dựng ứng dụng theo kiến trúc MVVM (Model-View-ViewModel). Việc kết hợp Room để lưu trữ dữ liệu với LiveData và ViewModel giúp tách biệt rõ ràng giữa logic xử lý dữ liệu và giao diện người dùng, đồng thời giúp cập nhật UI một cách tự động khi dữ liệu thay đổi.

Bài học này sẽ giúp bạn hiểu cách tích hợp Room với LiveData và ViewModel trong Android để xây dựng một ứng dụng đơn giản.
📌 Các Thành Phần Cần Thiết
- Room: Là thư viện của Android để lưu trữ dữ liệu nội bộ bằng SQLite.
- LiveData: Là một phần của Android Jetpack, giúp quản lý và cập nhật UI một cách tự động khi dữ liệu thay đổi.
- ViewModel: Là lớp giúp quản lý dữ liệu UI và giữ dữ liệu sống sót qua các thay đổi vòng đời của Activity hoặc Fragment.
📌 Các Bước Tích Hợp Room với LiveData và ViewModel
1. Cấu Hình Phụ Thuộc trong build.gradle
Đầu tiên, bạn cần thêm các phụ thuộc của Room, LiveData, và ViewModel trong tệp build.gradle
của dự án.
dependencies {
implementation "androidx.room:room-runtime:2.4.0"
annotationProcessor "androidx.room:room-compiler:2.4.0"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.0"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0"
}
2. Tạo Entity (Đối Tượng Cơ Sở Dữ Liệu)
Entity là lớp đại diện cho bảng dữ liệu trong Room. Mỗi đối tượng trong bảng sẽ tương ứng với một đối tượng trong Java/Kotlin.
@Entity(tableName = "tasks")
public class Task {
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo(name = "task_name")
public String taskName;
@ColumnInfo(name = "is_completed")
public boolean isCompleted;
}
3. Tạo DAO (Data Access Object)
DAO là lớp chứa các phương thức để truy cập và thao tác với dữ liệu trong Room. Các phương thức trong DAO có thể trả về LiveData để quan sát dữ liệu.
@Dao
public interface TaskDao {
@Insert
void insert(Task task);
@Query("SELECT * FROM tasks")
LiveData<List<Task>> getAllTasks();
@Update
void update(Task task);
@Delete
void delete(Task task);
}
4. Tạo Database
Đây là lớp cơ sở dữ liệu chính, kết nối các Entity với DAO. Lớp này sẽ được sử dụng để truy cập dữ liệu từ các bảng.
@Database(entities = {Task.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract TaskDao taskDao();
}
5. Tạo ViewModel
ViewModel sẽ quản lý dữ liệu UI và giữ chúng sống sót qua các thay đổi vòng đời của Activity hoặc Fragment. ViewModel sẽ giao tiếp với Room thông qua DAO để lấy dữ liệu.
public class TaskViewModel extends AndroidViewModel {
private final TaskDao taskDao;
private final LiveData<List<Task>> allTasks;
public TaskViewModel(Application application) {
super(application);
AppDatabase db = Room.databaseBuilder(application, AppDatabase.class, "task-database")
.build();
taskDao = db.taskDao();
allTasks = taskDao.getAllTasks();
}
public LiveData<List<Task>> getAllTasks() {
return allTasks;
}
public void insertTask(Task task) {
new Thread(() -> taskDao.insert(task)).start();
}
}
6. Tạo Activity hoặc Fragment để Hiển Thị Dữ Liệu
Bây giờ, chúng ta sẽ kết nối LiveData với giao diện người dùng trong Activity hoặc Fragment. Khi dữ liệu thay đổi trong Room, LiveData sẽ tự động cập nhật UI mà không cần phải gọi lại.
public class MainActivity extends AppCompatActivity {
private TaskViewModel taskViewModel;
private TaskAdapter taskAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
taskAdapter = new TaskAdapter();
recyclerView.setAdapter(taskAdapter);
// Khởi tạo ViewModel
taskViewModel = new ViewModelProvider(this).get(TaskViewModel.class);
// Quan sát dữ liệu từ LiveData
taskViewModel.getAllTasks().observe(this, tasks -> {
taskAdapter.submitList(tasks); // Cập nhật danh sách task
});
// Thêm một task mới
findViewById(R.id.addButton).setOnClickListener(v -> {
Task task = new Task();
task.taskName = "New Task";
task.isCompleted = false;
taskViewModel.insertTask(task);
});
}
}
📌 Giải Thích Hoạt Động
- Room sẽ giúp bạn lưu trữ và truy xuất dữ liệu vào/ra cơ sở dữ liệu.
- LiveData giúp bạn quan sát và cập nhật UI mỗi khi có thay đổi trong dữ liệu.
- ViewModel giúp quản lý và duy trì dữ liệu qua các thay đổi vòng đời của Activity hoặc Fragment, đảm bảo dữ liệu không bị mất khi cấu trúc giao diện thay đổi (ví dụ: xoay màn hình).
✅ Kết Luận
- Room, LiveData, và ViewModel đều là những công nghệ mạnh mẽ của Android Jetpack, giúp bạn dễ dàng xây dựng ứng dụng với kiến trúc MVVM.
- Việc kết hợp LiveData với Room giúp bạn xây dựng ứng dụng có khả năng tự động cập nhật giao diện khi dữ liệu thay đổi mà không cần phải thao tác thủ công.
- ViewModel giúp dữ liệu của bạn tồn tại qua các thay đổi vòng đời, giữ cho ứng dụng của bạn ổn định và dễ duy trì.