[Android Cơ Bản] Lưu trữ dữ liệu với Android Room – Phần 2
Phần 1 : http://www.dotplays.com/android-co-ban-luu-tru-du-lieu-voi-android-room/
Hi các em , trong bài trước thầy đã hướng dẫn các em cách sử dụng Android Room để lưu trữ cơ sở dữ liệu SQLite. Tuy nhiên, do các câu lệnh của Android Room cần được gọi trong 1 luồng riêng nên trong bài này, chúng ta cập nhật thêm sử dụng kết hợp với lớp AsyncTask để mở luồng mới khi truy vấn nhé.
Kế tiếp bài trước. chúng ta tạo thêm 1 class là UserQueryTask.java và viết nội dung như sau :
// phương thức khởi tạo public AppDatabase appDatabase; public UserQueryTask(Context context) { appDatabase = Room.databaseBuilder(context, AppDatabase.class, "user.db").build(); // câu lệnh allowMainThreadQueries bị loại bỏ }
Bổ sung thêm 1 interface để viết hàm callback cho luồng mới
public interface OnQuery<T> { void onResult(T t); }
Khai báo AsyncTask cho các câu lệnh truy vấn với Android Room
Câu lệnh lấy danh sách User
private class GetUsersAsyncTask extends AsyncTask<Void, Void, List<User>> { OnQuery onQuery; public GetUsersAsyncTask(OnQuery onQuery) { this.onQuery = onQuery; } @Override protected List<User> doInBackground(Void... voids) { return appDatabase.userDao().getAll(); } @Override protected void onPostExecute(List<User> users) { super.onPostExecute(users); onQuery.onResult(users); } }
Câu lệnh thêm User
private class InsertUsersAsyncTask extends AsyncTask<User, Void, long[]> {
OnQuery onQuery;
public InsertUsersAsyncTask(OnQuery onQuery) {
this.onQuery = onQuery;
}
@Override
protected long[] doInBackground(User... users) {
return appDatabase.userDao().insertAll(users);
}
@Override
protected void onPostExecute(long[] longs) {
super.onPostExecute(longs);
this.onQuery.onResult(longs);
}
}
Phương thức lấy danh sách và thêm User sau khi có AsyncTask như sau :
public void getAllUsers(OnQuery<List<User>> onQuery) {
new GetUsersAsyncTask(onQuery).execute();
}
public void insertUsers(OnQuery<long[]> onQuery, User... users) {
new InsertUsersAsyncTask(onQuery).execute();
}
Cách dùng :
//Lấy danh sách User UserQueryTask userQueryTask = new UserQueryTask(this); userQueryTask.getAllUsers(new UserQueryTask.OnQuery<List<User>>() { @Override public void onResult(List<User> users) { MainActivity.this.users.addAll(users); Log.e("ABC", users.size() + ""); userAdapter.notifyDataSetChanged(); } }); //Thêm User User user = new User(); user.id = new Random().nextInt(); user.name = "Huy Nguyen"; user.phone = "0913456789"; userQueryTask.insertUsers(new UserQueryTask.OnQuery<long[]>() { @Override public void onResult(long[] longs) { // kết quả trả về là 1 array long, nếu thành công là 1 giá trị > 0 } },user);