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

उदाहरण के लिए

DocumentReference documentReference =
      await FirebaseFirestore.instance.collection('sth').add(map); //map has a 'docId' key

 await FirebaseFirestore.instance
  .collection('sth')
  .doc('${documentReference.id}')
  .update({'docId': documentReference.id});

अद्यतन एक ऑफ़लाइन दृढ़ता नहीं है, क्या इसके आसपास कोई रास्ता है?

0
user14624595 21 जिंदा 2021, 16:22
update के बजाय set का उपयोग करने का प्रयास करें
 – 
Dima Rostopira
21 जिंदा 2021, 16:49
यह सेट के साथ काम नहीं करता है
 – 
user14624595
22 जिंदा 2021, 10:39

1 उत्तर

सबसे बढ़िया उत्तर

जैसा कि दीमा ने टिप्पणी की, आप इसे पहले आईडी बनाकर हल कर सकते हैं, और उसके बाद ही डेटा और उसकी आईडी दोनों के साथ दस्तावेज़ लिख सकते हैं।

दस्तावेज़ आईडी को बिना लिखे जेनरेट करने के लिए, आप कॉल कर सकते हैं doc() पर CollectionReference पर बिना किसी तर्क के पर जाएं।

DocumentReference documentReference =
     FirebaseFirestore.instance.collection('sth').doc();

map["docId"] = documentReference.id;

FirebaseFirestore.instance
  .collection('sth')
  .doc('${documentReference.id}')
  .set(map);

अब पहली पंक्ति एक शुद्ध क्लाइंट-साइड ऑपरेशन है, बिना किसी डेटा को अभी तक डेटाबेस में लिखा गया है - इसलिए आप एक एकल, परमाणु लेखन/set() के साथ समाप्त होते हैं।

0
Frank van Puffelen 28 जिंदा 2021, 18:28
हम मूल रूप से वही काम करते हैं, आप एक काला दस्तावेज़ बनाते हैं, जबकि मैं एक नया लिखता हूं। मेरा मानना ​​​​है कि समस्या यह है कि चूंकि documentReference.id एक रनटाइम वैरिएबल है, जब मैं ऐप को फिर से शुरू करता हूं और यह अनुरोध को स्वचालित रूप से उस समय में मान शून्य हो जाता है। क्या इसके आसपास कोई रास्ता है?
 – 
user14624595
22 जिंदा 2021, 10:41
उत्तर वास्तव में बीच में है। मुझे एक दस्तावेज़ संदर्भ बनाना चाहिए, लेकिन बिना प्रतीक्षा विधि के और फिर उस आईडी के साथ दस्तावेज़ को बिना प्रतीक्षा के फिर से सेट करना चाहिए, क्योंकि मुझे कैश करने के लिए ऊपर की तरह हर दूसरे फ़ंक्शन की आवश्यकता है। फिर जब उपयोगकर्ता फिर से इंटरनेट पाता है तो फ़ंक्शन को कॉल किया जा रहा है। मुख्य समस्या प्रतीक्षा के उपयोग में थी।
 – 
user14624595
22 जिंदा 2021, 14:14
1
मेरे पहले स्निपेट में await की वास्तव में आवश्यकता नहीं है; मैंने इसे हटा दिया। मेरे उत्तर के बारे में अधिक महत्वपूर्ण बात यह है कि बिना किसी तर्क के doc() कॉल वास्तव में डेटाबेस में एक दस्तावेज़ नहीं बनाता है, लेकिन केवल एक संदर्भ है। केवल set() को कॉल करने से ही दस्तावेज़ तैयार होता है।
 – 
Frank van Puffelen
22 जिंदा 2021, 18:27
क्या आपने यहां कोई प्रगति की?
 – 
Frank van Puffelen
28 जिंदा 2021, 06:02
1
किया हुआ। यह सुनकर अच्छा लगा कि आपने इसे काम कर लिया। मैं
 – 
Frank van Puffelen
28 जिंदा 2021, 18:28