android - Firebase runTransaction काम नहीं कर रहा है-MutableData शून्य है



firebase-realtime-database transactions (1)

मैं runTransaction() डेटाबेस के runTransaction() का उपयोग करने की कोशिश कर रहा हूं लेकिन यह काम नहीं कर रहा है। यहाँ कोड का उपयोग कर रहा हूँ।

numQuestionRef.runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(MutableData mutableData) {
        String numQuestions = (String) mutableData.getValue();
        long value = Long.parseLong(numQuestions, 16);
        value++;
        String incHex = Long.toHexString(value);
        mutableData.setValue(incHex);
        return Transaction.success(mutableData);
    }

    @Override
    public void onComplete(FirebaseError firebaseError, boolean b, DataSnapshot dataSnapshot) {


    }
});

जब मैं अपने ऐप के भीतर एक बटन दबाता हूं तो यह कोड सक्रिय हो जाता है। जब मैं एप्लिकेशन लॉन्च करने के बाद पहली बार बटन दबाता हूं, तो मेरा डेटाबेस नहीं बदलता है। लेकिन जब मैं ऐप लॉन्च करने के बाद दूसरी बार बटन दबाता हूं, तो वह इसे अगले नंबर पर अपडेट करता है। मुझे समझ नहीं आता कि यह क्या गलत है या यह केवल दूसरे बटन प्रेस पर ही क्यों होता है।


आप लेनदेन से निपटने के लिए फायरबेस डॉक्यूमेंटेशन में उपयोग किए गए पैटर्न का पालन करना चाहते हैं और उस मामले को संभालेंगे जहां आपके करंट कॉलबैक का कोई वर्तमान मूल्य नहीं है:

public Transaction.Result doTransaction(MutableData currentData) {
    long value = 0;
    if(currentData.getValue() != null) {
        String numQuestions = (String) currentData.getValue();
        value = Long.parseLong(numQuestions, 16);
    }
    value++;
    String incHex = Long.toHexString(value);
    currentData.setValue(incHex);
    return Transaction.success(currentData);
}

आपको ऐसा करने की आवश्यकता का कारण यह है कि Firebase कई बार आपके लेनदेन कॉलबैक को निष्पादित कर सकता है (और अक्सर) आपको इसे पूरा करना होगा।

  1. जब आप पहली बार runTransaction() कॉल runTransaction() , तो Firebase क्लाइंट तुरंत अपने doTransaction() कॉलबैक को वर्तमान डेटा के लिए अपने वर्तमान अनुमान के साथ आमंत्रित करेगा। अक्सर यह null होगा।
  2. आपका कोड वर्तमान मूल्य के आधार पर अगला मूल्य लौटाता है। उपरोक्त मामले में, यदि वर्तमान मूल्य null था तो नया मूल्य 1 होगा।
  3. फायरबेस क्लाइंट तब मान लिया गया वर्तमान मान और नया मान सर्वर पर भेजता है।
  4. यदि वास्तविक संग्रहीत मान मान वर्तमान मान के समान है, तो Firebase सर्वर आपके द्वारा निर्दिष्ट नया मान लिखता है।
  5. यदि वास्तविक संग्रहीत मान ग्रहण किए गए वर्तमान मान से भिन्न है, तो फायरबेस सर्वर नए मान को अस्वीकार करता है और ग्राहक को वास्तविक वर्तमान मूल्य भेजता है।
  6. इस स्तर पर क्लाइंट स्टेप 1 पर वापस जाता है, जिसमें अब अपडेटेड वर्त्तमान मान है।

यदि यह आपके द्वारा देखे जा रहे व्यवहार की व्याख्या नहीं करता है, तो आप यह जांचना चाहते हैं कि किन मूल्यों को onComplete() में पारित किया गया है।





transactions