Android làm việc với cơ sở dữ liệu Firebase Realtime (Phần 1)

1. Cách Dữ liệu được Lưu trữ - Cấu trúc JSON

Cơ sở dữ liệu thời gian thực Firebase là một cơ sở dữ liệu dạng lược đồ, trong đó dữ liệu được lưu trữ ở định dạng JSON. Về cơ bản toàn bộ cơ sở dữ liệu là một cây JSON lớn với nhiều nút. Vì vậy, khi bạn lên kế hoạch cho cơ sở dữ liệu của mình, bạn cần chuẩn bị cấu trúc json theo cách mà dữ liệu có thể truy cập dễ dàng hơn bằng cách tránh làm tổ các nút con.Dưới đây là một ví dụ về lưu trữ danh sách hồ sơ người dùng và bài viết trong cây json. Bạn có thể xem qua hướng dẫn cấu trúc cơ sở dữ liệu Firebase để tìm hiểu các thực hành tốt nhất trong khi xác định cấu trúc cơ sở dữ liệu.

{
  "users": [
    {
      "name": "Ravi Tamada",
      "email": "[email protected]",
      "address": "XXX, XXXX, 1234"
    }
  ],
  "posts": [
    {
      "id": 100,
      "author": "Ravi Tamada",
      "content": "This is awesome firebase realtime database...",
      "timestamp": "13892733894"
    }
  ]
}

2. Dữ liệu Offline

Firebase cung cấp hỗ trợ tuyệt vời khi nói đến dữ liệu ngoại tuyến. Nó sẽ tự động lưu trữ dữ liệu offline khi không có kết nối internet. Khi thiết bị kết nối internet, tất cả dữ liệu sẽ được đẩy đến cơ sở dữ liệu thời gian thực. Tuy nhiên, cho phép đĩa lưu trữ một cách bền bỉ dữ liệu ngoại tuyến ngay cả khi ứng dụng khởi động lại. Tính bền bỉ của đĩa có thể được kích hoạt bằng cách gọi dưới một dòng mã. Đây là hướng dẫn hoàn chỉnh về khả năng ngoại tuyến của firebase.

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

3. Thực hiện hoạt động CRUD

Trước khi tham gia vào ứng dụng android, tôi muốn cung cấp cho bạn thông tin cơ bản về thực hiện các hoạt động CRUD trên cơ sở dữ liệu thời gian thực. Sau đó chúng ta sẽ kết hợp tất cả các khái niệm này với nhau để tạo một ứng dụng đơn giản với cơ sở dữ liệu thời gian thực firebase làm phụ trợ.Để thực hiện bất kỳ hoạt động nào trên cơ sở dữ liệu cho dù nó có thể được đọc hay viết, trước hết bạn cần lấy tham chiếu đến cơ sở dữ liệu. Đoạn mã dưới đây cho phép bạn tham chiếu tới nút top của cơ sở dữ liệu JSON. Từ đây, bạn cần phải sử dụng các tên nút con để đi qua xa hơn.

private DatabaseReference mDatabase;
 
mDatabase = FirebaseDatabase.getInstance().getReference();

3.1 Chèn dữ liệu

Để chèn dữ liệu, bạn có thể sử dụng phương thức setValue () trên đường dẫn tham chiếu cơ sở dữ liệu. Điều này sẽ tạo ra hoặc cập nhật giá trị trên đường dẫn được cung cấp. Đối với một ví dụ dưới đây mã chèn một nút gọi là "bản quyền" ở mức cao nhất json.

DatabaseReference mRef = mDatabase.getReference("copyright");
 
mRef.setValue("©2016 androidhive. All rights Reserved");

Cơ sở dữ liệu thời gian thực chấp nhận nhiều kiểu dữ liệu String, Long, Double, Boolean, Map <String, Object>, List <Object> để lưu dữ liệu. Bạn cũng có thể sử dụng các đối tượng java tùy chỉnh để lưu trữ dữ liệu rất hữu ích khi lưu trữ mô hình lớp trực tiếp trong cơ sở dữ liệu.

Giả sử bạn muốn lưu trữ hồ sơ người dùng trong cơ sở dữ liệu. Đầu tiên bạn cần phải tạo ra mô hình User với một constructor trống và các thuộc tính khác.

@IgnoreExtraProperties
public class User {
 
    public String name;
    public String email;
 
    // Default constructor required for calls to
    // DataSnapshot.getValue(User.class)
    public User() {
    }
 
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
}

Vì mỗi người dùng cần một Id duy nhất, bạn có thể tạo ra một bằng cách gọi phương thức push () tạo ra một nút rỗng với khóa duy nhất. Sau đó, lấy tham chiếu đến nút 'người dùng' bằng cách sử dụng child () method. Cuối cùng, sử dụng phương thức setValue () để lưu trữ dữ liệu người dùng.

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("users");
 
// Creating new user node, which returns the unique key value
// new user node would be /users/$userid/
String userId = mDatabase.push().getKey();
 
// creating user object
User user = new User("Ravi Tamada", "[email protected]");
 
// pushing user to 'users' node using the userId
mDatabase.child(userId).setValue(user);

Bằng cách chạy mã trên, một nút người dùng mới sẽ được chèn vào trong cơ sở dữ liệu với một giá trị khóa duy nhất. Nhìn chung, id người dùng cần được thu thập bằng cách sử dụng Firebase Auth trong ứng dụng của bạn cho phép bạn authId hoạt động như id người dùng.

{
  "users": [
    "-KTYWvZG4Qn9ZYTc47O6" : {
      "email" : "[email protected]",
      "name" : "Ravi Tamada"
    },
    {
      ...
    }
  ]
}

3.2 Đọc dữ liệu

Để đọc dữ liệu, bạn cần phải đính kèm các ValueEventListener () để tham khảo cơ sở dữ liệu. Sự kiện này sẽ được kích hoạt bất cứ khi nào có sự thay đổi dữ liệu trong thời gian thực. Trong onDataChange (), bạn có thể thực hiện các hoạt động mong muốn vào dữ liệu mới.

Dưới đây là trình lắng nghe sự kiện được kích hoạt bất cứ khi nào có thay đổi trong dữ liệu tiểu sử người dùng mà chúng tôi đã tạo ra trước đó.

mDatabase.child(userId).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
 
        User user = dataSnapshot.getValue(User.class);
 
        Log.d(TAG, "User name: " + user.getName() + ", email " + user.getEmail());
    }
 
    @Override
    public void onCancelled(DatabaseError error) {
        // Failed to read value
        Log.w(TAG, "Failed to read value.", error.toException());
    }
});

3.3 Đang cập nhật dữ liệu

Để cập nhật dữ liệu, bạn có thể sử dụng phương thức setValue () bằng cách truyền giá trị mới. Bạn cũng có thể sử dụng updateChildren () bằng cách đi qua đường dẫn để cập nhật dữ liệu mà không làm phiền các dữ liệu các nút con khác.

Ví dụ: nếu bạn chỉ muốn cập nhật email người dùng, bạn có thể sử dụng khối mã dưới đây.

String newEmail = '[email protected]';
 
mDatabase.child(userId).child("email").setValue(newEmail);

## 3.4 Xóa dữ liệu

Để xóa dữ liệu, bạn chỉ cần gọi phương thức removeValue () để tham khảo cơ sở dữ liệu. Bạn cũng có thể truyền vào null để setValue () phương pháp mà làm cùng một hoạt động xóa.Bạn có thể tìm hiểu thêm về thực hiện các hoạt động CRUD vào các dữ liệu tiên tiến hơn như Danh sách dữ liệu ở đây.

Nguồn dịch : https://www.androidhive.info/2016/10/android-working-with-firebase-realtime-database/