8

के माध्यम से फायरबेस डेटा के लिए क्वेरी पथ मुझे तीसरे पक्ष के डेटा के लिए पूछताछ करने का तरीका पता लग रहा है। यह इस प्रकार सेसी # FirebaseDatabase.net

/bucketa/bucketb/bucketc/someguidtypekey/anotherguidtypekey/(fields I want to map here)

संरचित है मैं इस की कोशिश की है है:

var stats = await firebase.Child("bucketa/bucketb/bucketc").OnceAsync<WrapperClass>(); 

कहाँ WrapperClass एक कुंजी/वस्तु कॉम्बो है, तो उस वस्तु किसी अन्य कुंजी/वस्तु कॉम्बो है, और फिर उस वस्तु वास्तविक है कक्षा।

public class WrapperClass 
{ 
    public string Key { get; set; } 
    public WrapperClass2 Stats { get; set; } 
} 

public class WrapperClass2 
{ 
    public string Key { get; set; } 
    public RealClass Stats { get; set; } 
} 

public class RealClass 
{ 
    public string Field1 { get; set; } 
    public string Field2 { get; set; } 
    public string Field3 { get; set; } 
    public string Field4 { get; set; } 
} 

मैं भी कोशिश की है:

var stats = await firebase.Child("bucketa/bucketb/bucketc/*/*").OnceAsync<RealClass>(); 

लेकिन वह सिर्फ ऑब्जेक्ट प्रकार के एक स्ट्रिंग लौट आए।

क्या कोई यहां मदद कर सकता है?

यह C# में है का उपयोग कर FirebaseDatabase.net

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

ठीक है, अब हम करीब हो रही है।

...OnceAsync<Dictionary<string, Dictionary<string, RealClass>>>(); 

मैं अब त्रुटि मिल रही है:

Error converting value True to type 'RealClass'

त्रुटि में, यह कहना है कि वह RealClass.property1 कन्वर्ट करने के लिए जहां property1 प्रकार की है कोशिश कर रहा है (उनकी टिप्पणियों में से एक से) @ElmarJensen ठीक लागू करने bool

यह property1 को मेरे ऑब्जेक्ट के बजाय RealClass ऑब्जेक्ट प्रकार में परिवर्तित करने का प्रयास क्यों कर रहा है? संरचना मुझे समझ में आता है। और अपवाद में, "प्रतिक्रिया डेटा" संपत्ति में उन सभी रिकॉर्ड्स हैं जिन्हें मैंने सही JSON प्रारूप में अपेक्षित किया था, इसलिए यह सुनिश्चित न करें कि यहां क्या हो रहा है।

संपादित करें 2: यहाँ वास्तविक डेटा प्रारूप है:

{ 
    "0M6bRFLLokR6sIJAcKFN6y91NXB3": { 
     "-KYdDf62eQUMGb-ov737": { 
      "somethingBoolean":true, 
      "asdf":"Joe User", 
      "oasdfasdfsad": { 
       "firstName":"asdf", 
       "lastName":"asdfasdf", 
       "tasdfme":"Wasdfh", 
       "teasdfore":6, 
       "teaasdfme":"SDFO" 
      }, 
      "fasdfewaef":0, 
      "startedAt":1.481381640492956E9, 
      "updatedAt":1.481381687802693E9, 
      "wfefeaefw":"182", 
      "asdf": { 
       "firstName":"asdf", 
       "lastName":"asdf", 
       "asdf":"asdfasdfasdf", 
       "teamScore":0, 
       "asefeawfawef":"DFDFSWEF" 
      }, 
      "aefawefawefawefawef":0 
     } 
    } 
} 
+0

चेक इस [Retrieving Data] (https://firebase.google.com/docs/database/admin/retrieve-data) –

उत्तर

2

वाइल्डकार्ड ("bucketa/bucketb/bucketc/*/*") है कि Firebase में की तरह अस्तित्व में नहीं है, इसलिए यदि आपके पास कोई डेटास्ट्रक्चर पर प्रभाव, आप "बकेट/बाल्टीब/बाल्टीक" पर रूट से एक बार में पूर्ण डेटा पेड़ डाउनलोड करने के साथ अटक गए हैं। समस्या यह है कि फायरबेस-डेटाबेस-डॉटनेट के लिए, इस पेड़ के "बच्चे" (someguidtypekey/anotherguidtypekey) वस्तु के गुण के रूप में GUIDkey के साथ वस्तु के गुण के रूप में दिखाई देंगे - जिसका अर्थ है कि आपको संकलन समय पर guidkeys को जानने की आवश्यकता है इसके लिए काम करने के लिए। हालांकि, यह देखते हुए कि विधि हुड के नीचे JSON.net का उपयोग करता है, और कहा कि पुस्तकालय के रूप में अच्छी तरह से वस्तुओं के बजाय शब्दकोश में deserializing समर्थन करता है, निम्नलिखित वास्तव में काम हो सकता है:

await firebase.Child("bucketa/bucketb/bucketc").OnceAsync<Dictiona‌​ry<string, Dictionary<string, RealCl‌​ass>>>(); 

इसके अलावा, अगर यह केवल एक प्रश्न है, यह है एचटीपी क्लाइंट के साथ "मैन्युअल" करने के लिए काफी आसान होगा, या फायरशर्प (एक और एफबी का उपयोग करें।शुद्ध पुस्तकालय, https://github.com/ziyasal/FireSharp) आप "कच्चे" लौटे JSON करने के लिए आसान सीधी पहुंच की अनुमति देता है कि, इस तरह:

FirebaseResponse response = await client.GetAsync("bucketa/bucketb/bucketc"); 
var myJson = response.Body; 

उसके बाद, आप आसानी से वापस आ json वस्तु (उदा Iterating over JSON object in C#) के गुणों पुनरावृति कर सकते हैं।

बेशक, यदि आपके पास डेटास्ट्रक्चर पर प्रत्यक्ष नियंत्रण था, तो सलाह है कि इसे आगे बढ़ाया जाए (https://firebase.google.com/docs/database/android/structure-data देखें)।

मुझे पूरी तरह से यकीन नहीं है कि आपका क्या मतलब है "लेकिन उसने ऑब्जेक्ट प्रकार की एक स्ट्रिंग वापस कर दी।" .OnceAsync<RealClass>(); फ़ायरबेस ऑब्जेक्ट (मूल वस्तु को अपनी ऑब्जेक्ट प्रॉपर्टी के रूप में उजागर किया गया है) की ऑब्जेक्ट्स का संग्रह वापस कर देगा - कभी स्ट्रिंग नहीं।

अद्यतन करने के लिए उत्तर दें

ऐसा लगता है के रूप में अगर आपकी क्वेरी एक परत गहरी की तुलना में मैं आप डेटा वर्णन मान लिया जाता है। क्या यह काम करेगा?

await firebase.Child("bucketa/bucketb/bucketc").OnceAsync<Dictiona‌​ry<string, RealCl‌​ass>>(); 
+0

प्रतिक्रिया के लिए धन्यवाद। बस मैं स्पष्ट हूं, मुझे लगता है कि आप कह रहे हैं कि मैं वाइल्डकार्ड दृष्टिकोण नहीं कर सकता, लेकिन क्या यह कक्षा के बारे में 2 रैपर कक्षाओं के साथ परिभाषित करना अभी भी संभव है जैसा कि आप यहां बता रहे हैं: " इस पेड़ के "बच्चे" (someguidtypekey/anotherguidtypekey) वस्तु के गुण के रूप में GUIDkey के साथ वस्तु के गुण के रूप में दिखाई देंगे "। इसलिए मैं 'रैपर क्लास' ऑब्जेक्ट्स की एक सरणी वापस ले जाऊंगा, जहां मैं उस सरणी को 'रियल क्लास' स्तर पर फ़्लैट कर सकता था। यह केवल मुझे आवश्यक डेटा है, इसलिए मैं विशेष रूप से इस डेटा संरचना के लिए कुछ विकसित करने के साथ ठीक हूं। – ganders

+0

समस्या यह है कि बच्चे सरणी या शब्दकोश वस्तु (कुंजी-मूल्य-जोड़े के साथ) के रूप में प्रकट नहीं होंगे, लेकिन हार्ड-कोड किए गए संपत्ति नामों के रूप में जिन्हें आप संकलित समय पर जानना चाहते हैं। इसका मतलब यह है कि अगर आप संकलन समय पर सभी "someguidtypekey" और "anotherguidtypekey" मानों को जानते हैं तो आप केवल तभी ऐसा कर सकते हैं। हालांकि, अगर आपके पास यह सूची है तो इसे पुन: सक्रिय करना और प्रत्येक पथ को अलग से पूछना बहुत आसान होगा ('var figures = = firebase.Child ("bucketa/bucketb/bucketc/key1/key2") का इंतजार करना। एक बार एसिंक (); ')। –

+0

एक बार जब मैं उस डेटा को वापस प्राप्त कर लेता हूं, तो क्या मैं सिर्फ शब्दकोश आइटम में सभी चाबियों को फिर से नहीं चला सकता, और उस तरह से फ़्लैट कर सकता हूं? इस तरह: 'foreach (myDictionary.Keys में var आइटम) { foreach (आइटम में var varItem.Keys) {flattenToThisObject (innerItem); } } '(मैं घर पर नहीं हूं इसलिए अभी तक परीक्षण/पीओसी नहीं कर सकता ...) – ganders