2013-07-29 12 views
8

का उपयोग कर डेटा पुनर्प्राप्त/प्रारूपित करने का सबसे अच्छा तरीका मैं का उपयोग Android प्रोजेक्ट पर डेटा संग्रहण के लिए कर रहा हूं, और डेटा से निपटने के लिए Firebase Java API का उपयोग कर रहा हूं। मुझे यकीन नहीं है कि मैं इसे यथासंभव कुशलता से कर रहा हूं, हालांकि, और डेटा को पुनर्प्राप्त करने और स्वरूपित करने के लिए मुझे सर्वोत्तम प्रथाओं पर कुछ सलाह चाहिए। मेरे Firebase भंडार कुछ इस तरह दिखता ....फायरबेस जावा एपीआई

-POLLS 
    NUMPOLLS - 5 
    (pollskey) - NAME - Poll1 
      NUMELECTIONS - 2 
      ELECTIONS 
       (electionskey) - NAME - Election1 
         NUMNOMINATIONS - 2 
         NUMVOTERS - 2 
         NUMBERTOELECT - 1 
         VOTERS - (votesrkey) - NAME - Charles 
             NUMBER - (678) 333-4444 
           . 
           . 
           . 
           (voterskey) - ... 
         NOMINATIONS - (nominationskey) - NAME - Richard Nixon 
               NUMBEROFVOTES - 2 
             . 
             . 
             . 
             (nominationskey) - ... 
      . 
      . 
      . 
      (electionskey) - ... 
    . 
    . 
    . 
    (pollskey) - ... 

तो, यहाँ उदाहरण के लिए मैं चुनाव नाम सूचीबद्ध करने के लिए एक जनमत सर्वेक्षण से बाहर सभी डेटा प्राप्त करने के लिए कोशिश कर रहा हूँ, यह चुनाव के नाम, और उम्मीदवार के नाम और संख्या है प्रत्येक चुनाव के लिए वोटों का। मैं

private static final Firebase polls = pollsFirebase.child("Polls"); 
protected void onCreate(Bundle savedInstanceState) { 

     polls.addListenerForSingleValueEvent(new ValueEventListener() { 

      @Override 
      public void onDataChange(DataSnapshot snapshot) { 
       for (DataSnapshot child : snapshot.getChildren()) { 
        if (!child.getName().equals("NumPolls")) { 
         createPollTableAndHeaders(child); 
        } 
       } 

      } 
     }); 
    } 

तो मैं डेटा की व्यक्तिगत टुकड़े मैं क्रमिक DataSnapshots पर getValue() आह्वान करने और जाँच कुंजी द्वारा की जरूरत को पढ़ने के लिए आगे बढ़ना चुनाव इस तरह अपने मुख्य गतिविधि के OnCreate() समारोह के दौरान स्तर DataSnapshot मिलता है ... जिसके परिणामस्वरूप HashMaps की ...

private void createPollTableAndHeaders(DataSnapshot poll) { 
    String pollName = ""; 
    int numPolls; 
    Object p = poll.getValue(); 
    if (p instanceof HashMap) { 
     HashMap pollHash = (HashMap) p; 
     if (pollHash.containsKey("Name")) { 
      pollName = (String) pollHash.get("Name"); 
     } 
     if (pollHash.containsKey("Elections")) { 
      HashMap election = (HashMap) pollHash.get("Elections"); 
      Iterator electionIterator = election.values().iterator(); 
      while (electionIterator.hasNext()) { 
       Object electionObj = electionIterator.next(); 
       if (electionObj instanceof HashMap) { 
        HashMap electionHash = (HashMap) electionObj; 
        if (electionHash.containsKey("Name")) { 
         String electionName = (String) electionHash.get("Name"); 
        } 
       } 
      }; 
     } 
    } 

इस डेटा संरचना के माध्यम से नीचे ड्रिल करने के लिए एक बहुत कठिन रास्ता की तरह लगता है, और वहाँ एक बेहतर तरीका है मैं सोच रहा हूँ।

मैंने प्रलेखन में getValue(java.lang.Class<T> valueType) विधि देखी है, लेकिन यह मेरे मामले में काम करने में सक्षम नहीं है, क्योंकि मैं रचनाकृत वस्तुओं के साथ काम कर रहा हूं और न केवल प्राचीन प्रकार के कंटेनर के लिए काम कर रहा हूं। फ़ंक्शन को कैसे पता चलता है कि Firebase डेटा मॉडल ऑब्जेक्ट के कौन से सदस्य चर को असाइन करने के लिए है? क्या यह Firebase सदस्य चर के साथ महत्वपूर्ण नाम से मेल खाता है, और इसलिए इन्हें संवेदनशीलता के साथ, बिल्कुल वही होना चाहिए? Firebase के साथ यह सौदा कैसे होगा List पर धक्का देते समय उत्पादित जैसे प्रमुख नाम उत्पन्न किए गए? रचना वस्तुओं के लिए मॉडल ऑब्जेक्ट्स कैसे बनाएं?

उत्तर

18

getValue(java.lang.Class valueType) विधि जैकसन ऑब्जेक्ट मैपिंग लाइब्रेरी के समान नियमों का पालन करती है (यह हम आंतरिक रूप से उपयोग करते हैं: http://wiki.fasterxml.com/JacksonInFiveMinutes)। इसलिए, आपके जावा क्लास में आपके द्वारा असाइन किए गए गुणों के लिए डिफ़ॉल्ट कन्स्ट्रक्टर (कोई तर्क नहीं) और गेटर्स होना चाहिए (https://www.firebase.com/docs/java-api/javadoc/com/firebase/client/DataSnapshot.html#getValue(java.lang.Class))। संक्षेप में, हां, फ़ायरबेस में प्रमुख नाम सदस्य चर से मेल खाना चाहिए।

एक सूची सहित समग्र वस्तुओं का उपयोग करने के उदाहरण के लिए, AndroidDrawing देखें। विशेष रूप से, Segment कक्षा में Point उदाहरणों की एक सूची शामिल है। .push() विधि से उत्पन्न डेटा की सूचियों का उपयोग करके एक पकड़ है। चूंकि जेनरेट किए गए प्रमुख नाम स्ट्रिंग्स हैं ताकि वे ग्राहकों में अद्वितीय हो सकें, वे List एस के बजाय Map एस को deserialize। हालांकि, अगर आप dataSnapshot.getChildren() से अधिक सक्रिय करते हैं तो वे क्रम में वापस आ जाएंगे।

इसके अतिरिक्त, यदि आप हैश मैप में deserialize नहीं करना चाहते हैं, तो आप डेटा स्नैपशॉट पर बच्चे() विधि का उपयोग कर सकते हैं। उदाहरण के लिए:

 

String pollName = poll.child("Name").getValue(String.class); 
DataSnapshot elections = poll.child("Elections"); 
for (DataSnapshot election : elections.getChildren()) { 
    String electionName = election.child("Name").getValue(String.class); 
} 
 

इस उदाहरण में, किसी भी मान मौजूद नहीं है कि null के रूप में लौटा दी जाएगी।

आशा है कि मदद करता है!

+0

कूल धन्यवाद ग्रेग। घर लाने के लिए मुझे दो घंटे दें और इस तरह से लागू करने का प्रयास करें। धन्यवाद! – MassStrike

+0

ठीक है, यह सब कुछ है जिसे मुझे शुरू करने की आवश्यकता है। धन्यवाद ग्रेग, त्वरित समर्थन की सराहना करते हैं। – MassStrike

+0

पुराना धागा लाने के लिए खेद है, लेकिन, मैं जियोफायर का उपयोग फायरबेस के साथ कर रहा हूं और जिओलोकेशन क्लास एक डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान नहीं करता है। तो, मैं इस तरह के वर्ग को deserialize कैसे आगे बढ़ना चाहिए? क्या कोई deserializer कारखाना एम्बेडेड है? धन्यवाद ! – Leonardo

1

सार्वजनिक टी getValue (कक्षा ValueType)

1।कक्षा में एक डिफ़ॉल्ट कन्स्ट्रक्टर होना चाहिए जिसमें

2. कक्षा को गुणों के लिए सार्वजनिक गेटर्स को परिभाषित करना होगा। एक सार्वजनिक गेटर बिना प्रॉपर्टी अपनी डिफ़ॉल्ट मान पर सेट किया जाएगा जब एक उदाहरण deserialized है

से यह जाँच करें: this source यह आप में मदद करेंगे

detail