मैं "पोस्ट" नामक रीयलटाइम डेटाबेस में एक बाल पथ का निरीक्षण करने के लिए नए फायरबेस एपीआई का उपयोग कर रहा हूं

यहाँ एक JSON प्रविष्टि है:

"posts" : {

"-KLT6oYF-F_5sf-dC_2R" : {
  "items" : {
    "item1" : {
      "location" : "Post Street Mall",
      "name" : "Glasses",
      "price" : "199",
      "vendor" : "Clicks"
    }},      
  "tags" : "summer, casual, urban ",
  "title" : "Casual Summer "
}

समस्या यह है कि जब भी मैं "पोस्ट" में कुछ जोड़ता हूं तो बच्चे को जोड़ा गया ईवेंट निकाल दिया जाता है और मेरा ऐप डेटाबेस अपडेट हो जाता है। दुर्भाग्य से सभी डेटा अभी तक सेटवैल्यू () का उपयोग करके नहीं जोड़ा गया है।

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

किसी भी प्रकार की मदद की बेहद सराहना की जाती है।

मूल नमूना कोड इस प्रकार है:

    // CREATING DATABASE OBSERVER TO SCAN POSTS

    let postRef = database.child("posts")
    // CONNECTING OBSERVER AND CHECKING FOR NEW ITEMS
    postRef.observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in

     // This is in a different class
     postDBRef.child("title").setValue(self.mainImageTxt?.text) // I think this triggers the child added already?                postDBRef.child("tags").setValue(self.tagsTxt?.text?.lowercaseString)                
     // getting cell data
     for rowIndex in 0..<self.stepperValue {
         let cell = self.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: rowIndex, inSection: 0)) as! AddPostTableViewCell
         let itemName = cell.itemNameTxt.text!
         postDBRef.child("items/item\(rowIndex + 1)/name").setValue(itemName)
          }
0
arvidurs 30 जून 2016, 12:41

2 जवाब

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

कोड में एक ऑब्जेक्ट बनाएं, एक डिक्शनरी कहें और इसे एक बार में लिखें! इससे उस पुनरावृत्ति को करने की आवश्यकता समाप्त हो जाएगी। फिर आप setValue(myObject) कर सकते हैं और समस्या दूर हो जाती है।

मैंने आपके द्वारा उपयोग किए जा रहे डेटा संरचना के समान डेटा संरचना तैयार करने के लिए कुछ त्वरित कोड चाबुक किया है। यह कोड में संरचना का निर्माण करेगा और फिर इसे एक सेटवैल्यू के साथ लिख देगा।

मान लें कि आप निम्न डेटा संरचना चाहते हैं

items
  item4
    name: some item 3
  item8
    name: some item 7

कोड में इसे प्राप्त करने का तरीका यहां दिया गया है

    let stepperValue = 10
    var myDict = [String:  [String: String] ]()

    for rowIndex in 0..<stepperValue {
        let itemName = "some item \(rowIndex)"
        let childDict = ["name": itemName]
        let parentKey = "item\(rowIndex + 1)"
        myDict[parentKey] = childDict
    }

    let ref = myRootRef.childByAppendingPath("items")
    ref.setValue(myDict)
1
Jay 1 जुलाई 2016, 00:29

आप केवल updateChildValues के साथ जा सकते हैं, उन परिवर्तनों को ध्यान में रखते हुए जिन्हें आप एक सरणी में लिखना चाहते हैं

 let childUpdates = ["/posts/\(postKey)": postData,
                    "/posts/\(anotherPostId)": anotherPostData]

और जब आपके पास वे सभी पोस्ट हों जिन्हें आप अपडेट करना चाहते हैं तो आप बस कॉल करें

ref.updateChildValues(childUpdates)

यह डेटा को एक बार लिखेगा और यह आपके द्वारा जोड़े गए प्रत्येक बच्चे के लिए एक चाइल्ड एडेड इवेंट को कॉल करेगा।

दस्तावेज़ीकरण यहां

1
adolfosrs 30 जून 2016, 15:07