Helpex - Trao đổi & giúp đỡ Đăng nhập
22

Sau khi xóa dữ liệu khỏi của tôi Firestore Database, tôi phải mất Android appmột khoảng thời gian để nhận ra rằng dữ liệu đã bị xóa và tôi cho rằng điều đó xảy ra do bộ đệm dữ liệu tự động. Ứng dụng của tôi không liên quan gì đến việc sử dụng ngoại tuyến và tôi muốn tắt tính năng này ...

Tôi đã thêm điều này vào tùy chỉnh của mình Application Class:

import android.app.Application;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreSettings;

public class ApplicationClass extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        FirebaseFirestore db=FirebaseFirestore.getInstance();
        FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
                .setPersistenceEnabled(false)
                .build();
        db.setFirestoreSettings(settings);
    }
}

Sự cố xảy ra sau khi tắt kết nối internet và sau khi bật lại ( trong khi ứng dụng vẫn đang chạy, trong nền hoặc không ) - Firestore moduledường như mất kết nối với máy chủ và nó thực hiện hoạt động ngược lại so với dự định - thay vì dừng lại lấy tư liệu từ bộ nhớ cache, phải mất dữ liệu từ bộ nhớ cache chỉ .

Ví dụ, gỡ lỗi mã này sẽ luôn hiển thị rằng isFromCachetruedocumentSnapshottrống (mặc dù điều đó trên servermặt - nó không có sản phẩm nào):

usersRef.document(loggedEmail).collection("challenges_received").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
    @Override
    public void onSuccess(QuerySnapshot documentSnapshots) {
        boolean isFromCache=documentSnapshots.getMetadata().isFromCache();
        if (!documentSnapshots.isEmpty()) {
        }
    }
});

Đây có phải là hành vi bình thường không?

Có cách nào khác để tắt bộ nhớ cache dữ liệu trong Cloud Firestorekhông?


CHỈNH SỬA:

Thêm: FirebaseFirestore.setLoggingEnabled(flase);(thay vì mã ở trên) trong tùy chỉnh Application Classcho kết quả tương tự.

22 hữu ích 5 bình luận 9.8k xem chia sẻ
6

Theo bản cập nhật SDK Cloud Firestore 16.0.0 , hiện đã có giải pháp cho vấn đề này:

Không thể tắt dữ liệu ngoại tuyến trong Firestore


Bây giờ bạn có thể chọn nếu bạn muốn lấy dữ liệu từ máy chủ duy nhất , hoặc từ bộ nhớ cache chỉ , như thế này (một ví dụ cho máy chủ duy nhất):

DocumentReference documentReference= FirebaseFirestore.getInstance().document("example");
documentReference.get(Source.SERVER).addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
    @Override
    public void onSuccess(DocumentSnapshot documentSnapshot) {
            //...
    }
});

Chỉ đối với bộ nhớ cache, chỉ cần thay đổi mã ở trên thành Source.CACHE.


Theo mặc định, cả hai phương pháp vẫn thử máy chủ và quay trở lại bộ nhớ cache.

6 hữu ích 2 bình luận chia sẻ
6

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 releasevà 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 PersistenceEnabledtù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)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 DocumentReferencehoặc đến Querycá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 onlyhoặ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 .

6 hữu ích 2 bình luận chia sẻ
2

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder() .setPersistenceEnabled(false) .build(); dbEventHome.setFirestoreSettings(settings);

Bằng cách thiết lập này, nó sẽ luôn tìm nạp từ máy chủ.

2 hữu ích 0 bình luận chia sẻ
0
// Enable Firestore logging
    FirebaseFirestore.setLoggingEnabled(flase);
// Firestore
    mFirestore = FirebaseFirestore.getInstance();

Nói chung: ứng dụng Firebase cố gắng giảm thiểu số lần tải xuống dữ liệu. Nhưng nó cũng cố gắng giảm thiểu dung lượng bộ nhớ / không gian đĩa mà nó sử dụng.

Hành vi chính xác phụ thuộc vào nhiều thứ, chẳng hạn như liệu trình nghe khác có tiếp tục hoạt động trên vị trí đó hay không và liệu bạn có đang sử dụng ổ đĩa lâu dài hay không. Nếu bạn có hai trình nghe cho cùng một dữ liệu (hoặc chồng chéo), các bản cập nhật sẽ chỉ được tải xuống một lần. Nhưng nếu bạn xóa trình nghe cuối cùng cho một vị trí, dữ liệu cho vị trí đó sẽ bị xóa khỏi bộ đệm (bộ nhớ và / hoặc đĩa).

Nếu không nhìn thấy một đoạn mã hoàn chỉnh, thật khó để biết điều gì sẽ xảy ra trong trường hợp của bạn.

Ngoài ra: bạn có thể tự kiểm tra bằng cách bật ghi nhật ký của Firebase [Firebase setLoggingEnabled:YES];

hãy thử cái này Đối với DataBase FireBase

  mDatabase.getReference().keepSynced(false);      
      FirebaseDatabase.getInstance().setPersistenceEnabled(false);
0 hữu ích 2 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ java android firebase google-cloud-firestore , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading