8

第三者のデータを照会する方法がわかりません。c#FirebaseDatabase.netを介したFirebaseデータのクエリパス

WrapperClassはキー/オブジェクトのコンボで、そのオブジェクトが別のキー/オブジェクトのコンボで、そのオブジェクトが実際にある
var stats = await firebase.Child("bucketa/bucketb/bucketc").OnceAsync<WrapperClass>(); 

:ここで私はこれを試したことが

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

を構造化だ方法ですクラス。

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>(); 

をしかし、それは単にオブジェクト型の文字列を返しました。

は、誰もがここに助けることができますか?

すべての権利、今私たちが近づいている:

これはFirebaseDatabase.net

Editを使用して、C#です。 (彼のコメントのいずれかから)@ElmarJensen修正を実装:

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

私は今、エラーを取得しています。エラーで

Error converting value True to type 'RealClass'

、それはproperty1のタイプがある場合、RealClass.property1を変換しようとしていると言いますbool

なぜproperty1を親オブジェクトではなくRealClassオブジェクトタイプに変換しようとしていますか?構造は私にとって意味があります。例外的に、 "responseData"プロパティには、私が正しい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

はこれを確認してください:[データ検索](https://firebase.google.com/docs/database/admin/retrieve-data)応答のための –

答えて

2

ワイルドカード( "bucketa/bucketb/bucketc/*/*")あなたが持っているので、もし、Firebaseでそのように存在していない無データ構造への影響がある場合、rootの "bucketa/bucketb/bucketc"から一度に完全なデータツリーをダウンロードすることに悩まされています。問題は、firebase-database-dotnetの場合、このツリーの「子」(someguidtypekey/anotherguidtypekey)がGUIDkeyをプロパティ名として持つオブジェクトのプロパティとして表示されます。つまり、コンパイル時にguidkeysを知る必要がありますこれが機能するにはしかし、この方法は、ボンネットの下にJSON.netを使用し、そのライブラリが同様に辞書代わりのオブジェクトにデシリアライズサポートしていることを考えると、以下が実際に動作することがあります。

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

また、それが唯一のクエリであれば、それはこれをHttpClientで "手動で"行うか、FireSharp(別のFB)を使うのはかなり簡単です。このようなあなたの「生」が返さJSONに簡単に直接アクセスすることができますネットライブラリ、https://github.com/ziyasal/FireSharp)、:その後

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>();はFirebaseObject型のオブジェクトのコレクションを返します(元のオブジェクトはObjectプロパティとして公開されています)。決してStringではありません。あなたのクエリは、私はあなたのデータ記述から想定さよりも1層深く行くかのように更新する

返信

ですね。これは効果がありますか?

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

感謝を。ちょうど私は明らかですが、私はワイルドカードアプローチを行うことができないと言っているのを見ていますが、ここで述べているように、2つのラッパークラスを持つクラスを定義することによってそれを行うことは可能ですか?このツリーの「子」(someguidtypekey/anotherguidtypekey)は、プロパティ名としてGUIDkeyを持つオブジェクトのプロパティとして表示されます。そこで、 'WrapperClass'オブジェクトの配列を取得して、その配列を' RealClass'レベルまで平坦化することができます。これは私が必要とするデータなので、このデータ構造のために特別なものを開発することは大丈夫です。 – ganders

+0

問題は、子は(キーと値のペアを持つ)配列や辞書オブジェクトとして表示されず、コンパイル時に知っておく必要があるハードコードされたプロパティ名として表示されることです。これは、コンパイル時に "someguidtypekey"と "anotherguidtypekey"の値がすべて分かっている場合にのみ実行できることを意味します。しかし、リストを持っていれば、それを反復して各パスを別々に照会する方が簡単です( 'var stats = await firebase.Child(" bucket/bucketb/bucketc/key1/key2 "))。 )。 –

+0

このデータを受け取ったら、辞書項目のすべてのキーを繰り返し処理することはできませんでした。このように: 'foreach(myDictionary.Keysのvarアイテム) { foreach(item.Keysのvar innerItem){flattenToThisObject(innerItem); } } '私は自宅にいないので、まだ/ PoCはこれをテストできません... – ganders

関連する問題