Tôi vừa chạy một vài thử nghiệm trong một ứng dụng Android để xem cách này hoạt động như thế nào. Vì Firestore hiện vẫn đang hoạt động beta release
và sản phẩm có thể bị thay đổi bất kỳ lúc nào nên tôi không thể đảm bảo rằng hành vi này sẽ vẫn tiếp diễn trong tương lai.
db.collection("tests").document("fOpCiqmUjAzjnZimjd5c").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
DocumentSnapshot documentSnapshot = task.getResult();
System.out.println("isFromCache: " + documentSnapshot.getMetadata().isFromCache());
}
});
Về mã, không có vấn đề gì nếu chúng tôi lấy dữ liệu từ bộ nhớ cache hoặc bạn được kết nối với máy chủ.
Khi tôi trực tuyến, nó sẽ in:
isFromCache: false
Khi tôi ngoại tuyến, nó sẽ in:
isFromCache: true
Vì vậy, hiện tại, không có cách nào để dừng truy xuất dữ liệu từ bộ nhớ cache khi bạn không kết nối với máy chủ, vì bạn không thể buộc truy xuất dữ liệu từ bộ nhớ cache khi đang kết nối với máy chủ.
Nếu thay vào đó, tôi sử dụng một người nghe:
db.collection("tests").document("fOpCiqmUjAzjnZimjd5c").addSnapshotListener(new DocumentListenOptions().includeMetadataChanges(), new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(DocumentSnapshot documentSnapshot, FirebaseFirestoreException e) {
System.out.println("listener.isFromCache: " + documentSnapshot.getMetadata().isFromCache());
}
});
Tôi nhận được hai bản in khi tôi trực tuyến:
listener.isFromCache: true
listener.isFromCache: false
Firestore muốn truy xuất dữ liệu từ chache khi thiết bị ngoại tuyến vĩnh viễn hoặc trong khi ứng dụng của bạn tạm thời mất kết nối mạng và hiện tại bạn không thể thay đổi hành vi này.
Như một sự tổng hợp, một API thực hiện một cái gì đó như thế này, hiện chưa tồn tại.
Chỉnh sửa: Không giống như trong Firebase, nơi để kích hoạt tính duy trì ngoại tuyến bạn cần sử dụng dòng mã này:
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
Trong Firestore, dành cho Android và iOS, tính năng ổn định ngoại tuyến là enabled by default
.
Sử dụng dòng mã trên có nghĩa là bạn yêu cầu Firebase tạo bản sao cục bộ (nội bộ) của cơ sở dữ liệu để ứng dụng của bạn có thể hoạt động ngay cả khi tạm thời mất kết nối mạng.
Trong Firestore, chúng tôi thấy ngược lại, để vô hiệu hóa tính bền bỉ, chúng tôi cần đặt PersistenceEnabled
tùy chọn thành false
. Điều này có nghĩa là bạn yêu cầu Firestore không tạo bản sao cục bộ của cơ sở dữ liệu của bạn trên thiết bị người dùng, điều này có nghĩa là bạn sẽ không thể truy vấn cơ sở dữ liệu của mình trừ khi bạn được kết nối với máy chủ Firebase. Vì vậy, không có bản sao cục bộ của cơ sở dữ liệu của bạn và nếu bị hủy bỏ, một Ngoại lệ sẽ được ném ra. Đó là lý do tại sao một thực hành tốt để sử dụng OnFailureListener
.
Cập nhật (2018-06-13): Cũng như @TalBarda đã đề cập trong câu trả lời của mình, điều này hiện có thể bắt đầu với bản cập nhật phiên bản SDK 16.0.0. Vì vậy, chúng tôi có thể đạt được điều này với sự trợ giúp của các phương thức DocumentReference.get (Nguồn nguồn) và Query.get (Nguồn nguồn) .
Theo mặc định, get()
cố gắng cung cấp dữ liệu cập nhật khi có thể bằng cách chờ dữ liệu từ máy chủ, nhưng nó có thể trả về dữ liệu đã lưu trong bộ nhớ cache hoặc không thành công nếu bạn ngoại tuyến và không thể kết nối với máy chủ. Hành vi này có thể được thay đổi thông qua tham số Nguồn.
Vì vậy, bây giờ chúng tôi có thể vượt qua như một cuộc tranh cãi đến DocumentReference
hoặc đến Query
các nguồn vì vậy chúng tôi có thể buộc các truy xuất dữ liệu từ server only
, chache only
hoặc cố máy chủ và rơi trở lại vào bộ nhớ cache.
Vì vậy, một cái gì đó như thế này bây giờ có thể:
FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference docIdRef = db.collection("tests").document("fOpCiqmUjAzjnZimjd5c");
docIdRef.get(Source.SERVER).addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
//Get data from the documentSnapshot object
}
});
Trong trường hợp này, chúng tôi chỉ buộc lấy dữ liệu từ máy chủ. Nếu bạn chỉ muốn buộc dữ liệu được truy xuất từ bộ đệm ẩn, bạn nên chuyển làm đối số cho get()
phương thức Source.CACHE
,. Thêm thông tin ở đây .