Lưu và đọc dữ liệu từ Firebase

Android Java: Lưu và đọc dữ liệu từ Firebase Realtime Database

Android Java: Lưu và đọc dữ liệu từ Firebase Realtime Database

Chào các bạn,

Ta sẽ tiếp tục về phần CRUD với Firebase Realtime Database nhé.

Như các bạn đã biến, RDB cung cấp cho chúng ta 1 cây JSON cha, và từ đó ta sinh ra các thằng con tương ứng để sử dụng:

Vd:

-Project
—Posts
——-Post1
——-Post2
——-Post3
—Types
——-Type1

Đại loại như trên. Và ở JSON, 1 child ta có thể gán nhiều loại giá trị khác nhau như string, int, mảng,…

Bây giờ chúng ta đi vào phẩn lưu dữ liệu trước nhé.

1/ Lưu dữ liệu lên Firebase Realtime Database

Lưu ở đây mình sẽ hướng tới 3 phía là:

  • Tạo mới
  • Sửa
  • Xóa

Tại android Firebase đã hỗ trợ hết, ta có thể truyền cả object vào để lưu lên RDB, hay ArrayList, Map,…

Lưu ý class của các bạn phải có đủ Getter/Setter và kèm 1 hàm khởi tạo không parameter.

Thêm

Ta dùng hàm sau để đẩy lên 1 record mới ở RDB:

FirebaseDatabase.getInstance().getReference().push().setValue(<object_cua_ban>);

Cái này nó sẽ push 1 record mới ngay bên dưới. Tuy nhiên để push nó vào 1 cột json mình đã định nghĩa sẵn, ta có thể dùng .child(string)

FirebaseDatabase.getInstance().getReference().child("ABC").push().setValue(<object_cua_ban>);

Lưu ý khi push, Google sẽ tự sinh ra 1 unique key cho record đó, vậy nên nếu ta muốn giữ lại giá trị key, ta có thể làm như sau:

// Lấy ra keyID
String keyID = FirebaseDatabase.getInstance().getReference().push().getKey();

// set key vao object
<object_cua_ban>.setKey(keyID); // lưu lại để sau này dùng chẳng hạn

// set data
FirebaseDatabase.getInstance().getReference().child(keyID).setValue(<object_cua_ban>);

Và đây chính là cách sửa cơ bản trên RDB đó các bạn :D, thông qua key. Và từ đó các bạn chắc cũng hiểu tại sao mình phải lưu lại key sau khi push rồi mới setValue, để sau này ta có thể lấy ra cái key đó để sửa hoặc xóa.

Sửa/Cập nhập

Cách sửa cơ bản thì như trên, ngoài ra ta còn cách sửa nhiều object 1 lúc như sau:

// map để chứa thông tin chỉnh sửa
Map<String, Object> childUpdates = new HashMap<>();

// Thêm các object cần sửa kèm thông tin child 
// vd: Post/Key
childUpdates.put("key", <object_cua_ban>);
childUpdates.put("Abc/" + key, <object_cua_ban_2>);

// cập nhập lại
FirebaseDatabase.getInstance().getReference().updateChildren(childUpdates);

Không chỉ vậy, ta cũng có thể sửa trực tiếp thông qua sự kiện thay đổi value:

 

Xóa:

Cũng như sửa, xóa ta cũng cần ID, và ta sẽ xóa qua hàm .removeValue():

FirebaseDatabase.getInstance().getReference().child(keyID).removeValue();

2/ Lấy dữ liệu lên từ Realtime DB

Trước khi ta vào code, mình nên tìm hiểu rõ vụ lấy dữ liệu này.

Với RDB, là noSQL, nên ta không thể lấy dữ liệu như SQL được, nó sẽ bị giới hạn.

Ta sẽ lấy được dữ liệu các dạng như sau:

  • Toàn bộ dữ liệu.

Để lầy được toàn bộ dữ liệu, ta sẽ dùng như sau:

DatabaseReference all = FirebaseDatabase.getInstance().getReference();

Hoặc toàn bộ dữ liệu của thằng con:

Query allPost = FirebaseDatabase.getInstance().getReference().child("Posts");
  • Giới hạn n dữ liệu từ bắt đầu trở xuống hay kết thúc trở lên

Giới hạn dữ liệu của thằng con là 10 từ dưới cùng lên:

Query postBottom = FirebaseDatabase.getInstance().getReference().child("Posts").limitToLast(10);

Giới hạn dữ liệu của thằng con từ 10 từ trên cùng xuống:

Query postTop = FirebaseDatabase.getInstance().getReference().child("Posts").limitToFirst(10);
  • Lấy dữ liệu theo 1 điều kiện

Ví dụ ta có ID=ABCXYZ, ta cần lấy ra Post đó:

Query post = FirebaseDatabase.getInstance().getReference().child("Posts").child("ABCXYZ");

Hoặc khi ta đã lưu dc ID vào RDB như trên kia, thì:

Query post = FirebaseDatabase.getInstance().getReference().child("Posts").orderByChild("id").equalTo("ABCXYZ");

Hoặc lấy toàn bộ bài viết trong 1 danh mục có cateID=XYZ:

Query allCatePost = FirebaseDatabase.getInstance().getReference().child("Posts").orderByChild("cateID").equalTo("ABCXYZ");

Thêm sự kiện để lấy dữ liệu về.

Ở trên ta chỉ mới định nghĩa cách lấy thôi, và ta cần phải thêm sự kiện để lấy dữ liệu về 😀

Các bạn sẽ thêm sự kiện ở method addListenerForSingleValueEvent

VD cách lấy 1 mảng Post về:

ArrayList<Post> posts = null;

...

allPost.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        posts = new ArrayList<>();
                        for (DataSnapshot item : dataSnapshot)
                        {
                            Post post = item.getValue(Post.class);
                            posts.put(post);
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

Vậy là ta có thể dùng mảng posts, ta set mặc định nó là null để dễ dàng check 😀

Ngoài ra nếu lấy single post thì ta sửa lại như sau:

Post post = null;

...

allPost.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        Post post = dataSnapshot.getValue(Post.class);
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

Nếu class của ta ko có đủ getter/setter, nó sẽ bị lỗi ngay và data nó sẽ về dc 😀

Và mình xin kết thúc bài “Lưu và đọc dữ liệu Firebase Realtime Database” tại đây nhé 😀

Bài sau mình se hướng dẫn các bạn về Firebase UI kèm với Firebase Authentication 😀

Cám ơn các bạn đã quan tâm theo dõi!

facebook
Seth Phát

Seth Phát

Mình là Phát - biệt danh Seth Phát. Hiện đang là một Sr. Full-Stack Engineer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mạnh Back-end và khá Front-end, vẫn đang theo đều cả 2 :v. Còn gì bằng khi được làm những thứ mà mình yêu thích, đam mê ;)

Bình luận qua Facebook