[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);

Code mẫu : https://github.com/huuhuybn/AndroidRoom