android - फ़ायरस्टोर में ऑफ़लाइन डेटा अक्षम नहीं किया जा सकता




firebase google-cloud-firestore (2)

मेरे Firestore Database से डेटा को हटाने के बाद, यह मेरे Android app को एहसास करने के लिए कुछ समय लगता है कि डेटा हटा दिया गया था, और मुझे लगता है कि यह स्वत: डेटा कैश के कारण आ रहा है। ऑफ़लाइन उपयोग के साथ मेरा ऐप का कोई लेना देना नहीं है और मैं इस सुविधा को अक्षम करना चाहता हूं ...

मैंने इसे अपने कस्टम 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);
    }
}

इंटरनेट कनेक्शन को बंद करने और इसे वापस करने की तुलना में समस्या तब होती है ( जब भी ऐप अभी भी चल रहा है, पृष्ठभूमि में या नहीं ) - Firestore module सर्वर से कनेक्शन खोने लगता है, और यह इरादा से विपरीत ऑपरेशन बनाता है एक- कैश से डेटा लेना बंद करने के बजाय, यह केवल कैश से डेटा लेता है

उदाहरण के लिए, इस कोड को डीबग करना हमेशा दिखाएगा कि isFromCache true और documentSnapshot रिक्त है (भले ही server साइड पर - यह खाली नहीं है):

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()) {
        }
    }
});

क्या यह सामान्य व्यवहार है?

Cloud Firestore में डेटा कैश को अक्षम करने का एक और तरीका है?

संपादित करें:

जोड़ना: FirebaseFirestore.setLoggingEnabled(flase); (उपरोक्त कोड के बजाय) कस्टम Application Class में समान परिणाम देता है


// Enable Firestore logging
    FirebaseFirestore.setLoggingEnabled(flase);
// Firestore
    mFirestore = FirebaseFirestore.getInstance();

सामान्य में: फायरबेज क्लाइंट वह डेटा डाउनलोड करने की संख्या को कम करने की कोशिश करता है। लेकिन यह स्मृति / डिस्क स्थान की मात्रा को कम करने की भी कोशिश करता है

सटीक व्यवहार कई बातों पर निर्भर करता है, जैसे कि एक और श्रोता उस स्थान पर सक्रिय रहे और चाहे आप डिस्क दृढ़ता का उपयोग कर रहे हों यदि आपके पास एक ही (या अतिव्यापी) डेटा के लिए दो श्रोताओं हैं, तो अपडेट केवल एक बार डाउनलोड हो जाएंगे। लेकिन यदि आप किसी स्थान के लिए अंतिम श्रोता को हटाते हैं, तो उस स्थान का डेटा (मेमोरी और / या डिस्क) कैश से निकाल दिया जाता है।

कोड का पूरा टुकड़ा देखने के बिना, यह कहना मुश्किल है कि आपके मामले में क्या होगा।

वैकल्पिक रूप से: आप फायरबेज के लॉगिंग को सक्षम करके स्वयं की जांच कर सकते हैं [Firebase setLoggingEnabled:YES] ;

यह कोशिश करें FireBase डाटाबेस के लिए

  mDatabase.getReference().keepSynced(false);      
      FirebaseDatabase.getInstance().setPersistenceEnabled(false);

मैं एंड्रॉइड एप्लिकेशन में कुछ परीक्षणों को देखता हूं कि यह कैसे काम करता है। क्योंकि वर्तमान में beta release और उत्पाद को किसी भी समय परिवर्तन हो सकता है, मैं गारंटी नहीं दे सकता कि यह व्यवहार अभी भी भविष्य में होगा

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());
    }
});

कोड के संबंध में, यह कोई बात नहीं है अगर हमें कैशे से डेटा मिल रहा है या आप सर्वर से जुड़े हैं।

जब मैं ऑनलाइन हूँ तो यह प्रिंट करता है:

isFromCache: false

जब मैं ऑफ़लाइन हूं, तो यह प्रिंट करता है:

isFromCache: true

इसलिए, इस पल के लिए, कैश से डेटा की पुनर्प्राप्ति को रोकने का कोई तरीका नहीं है, जबकि आप सर्वर से कनेक्ट नहीं हैं, क्योंकि आप सर्वर से कनेक्ट होने के दौरान कैश से डेटा की पुनर्प्राप्ति को बल नहीं दे सकते।

यदि बजाय मैं एक श्रोता का उपयोग करता हूं:

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());
    }
});

जब मैं ऑनलाइन रहूं तो मुझे दो प्रिंट मिलते हैं:

listener.isFromCache: true
listener.isFromCache: false

फास्टस्टोर को चाचेस से डेटा प्राप्त करने के लिए desinged किया जाता है जब डिवाइस स्थायी रूप से ऑफलाइन हो जाता है या आपका एप्लिकेशन अस्थायी रूप से अपने नेटवर्क कनेक्शन खो देता है और इस समय आप इस व्यवहार को नहीं बदल सकते।

एक राय के रूप में, ऐसा एपीआई जो कुछ ऐसा करता है, वर्तमान में अभी तक मौजूद नहीं है।

संपादित करें: फ़ायरबेज के विपरीत, ऑफ़लाइन दृढ़ता को सक्षम करने के लिए आपको कोड की इस पंक्ति का उपयोग करने की आवश्यकता है:

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

फ़ायरस्टोर में, एंड्रॉइड और आईओएस के लिए, ऑफ़लाइन दृढ़ता enabled by default से enabled by default

कोड की उपरोक्त लाइन का प्रयोग करने का अर्थ है कि आप अपने डेटाबेस की स्थानीय (आंतरिक) प्रतिलिपि बनाने के लिए फायरबेज को बताएं ताकि आपका ऐप काम कर सके, भले ही वह अपने नेटवर्क कनेक्शन को अस्थायी रूप से खो दे।

फायरस्टोर में हम इसके विपरीत दिखाई देते हैं, दृढ़ता को अक्षम करने के लिए, हमें PersistenceEnabled विकल्प सेट करने की आवश्यकता है। इसका मतलब यह है कि आप फायरस्टोर को बताते हैं कि उपयोगकर्ता डिवाइस पर अपने डेटाबेस की एक स्थानीय प्रतिलिपि बनाने के लिए नहीं, जिसका मतलब है कि आप अपने डेटाबेस से क्वेरी नहीं कर पाएंगे, जब तक आप Firebase सर्वर से कनेक्ट नहीं होते हैं। इसलिए अपने डेटाबेस की एक स्थानीय प्रति के बिना और अगर डिस्कनेक्ट किया गया हो, तो एक अपवाद फेंक दिया जाएगा। यही कारण है कि OnFailureListener का उपयोग करने के लिए एक अच्छा अभ्यास है





google-cloud-firestore