2017-06-19 25 views
0

パーツの番号がわかっている場合、パーツの「loc」を表示しようとしています。Firebase Realtime Databaseからデータを取得できません

{ 
"parts":{ 
    "14521845": { "name":"TOOL EC160B/EC180B/EC210B/EC240", "loc":"EXC1", "sloc":"B3EGU01C03"}, 
    "12829050": { "name":"SWITCH; IGNITION SWITCH", "loc":"PS01", "sloc":"85-06-013"}, 
    "12829050": { "name":"SWITCH; IGNITION SWITCH", "loc":"COM1", "sloc":"B3RGK03D06"}, 
    "20044893": { "name":"PARTS CATALOG_ENG_SPA_FRE_GER_KOR_EC210D", "loc":"EXC1", "sloc":"B3EGT01B02"} 
} 
} 

アクティビティコード:ここで は、データ構造がどのように見えるかです

FirebaseDatabase firebaseDatabase=FirebaseDatabase.getInstance(); 
DatabaseReference databaseReference =firebaseDatabase.getReference("parts/"+curP); 

      databaseReference.addChildEventListener(new ChildEventListener() { 

       @Override 
       public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

        Products data=dataSnapshot.getValue(Products.class); 
        Log.i("",String.valueOf(data.getLoc())); 

       } 

をgetLocは、Productクラスのgetter関数であり、それは与えられたCURPに対応する「LOC」を返します。 curPは、部分の子値を示します。

ロジックは私にとっては正しいようですが、出力が得られません。私はここでどこが間違っていますか?

答えて

0

ValueEventListenerを使用できます。

private void getFirebaseLocValue(int curP) { 
    FirebaseDatabase firebase = FirebaseDatabase.getInstance(); 
    DatabaseReference mDatabase = firebase.getReference("parts"); 

    mDatabase.child(Integer.toString(curP)) 
     .addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if(dataSnapshot.hasChildren()) { 
       Products data = dataSnapshot.getValue(Products.class); 
       Log.e("TAG", data.getLoc()); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

それともaddValueEventListenerを使用することができますし、すべての変更を使用してデータを取得します:あなたは一度データを読みたい場合はそうaddListenerForSingleValueEvent方法、このようなものを使用します。私は実際には、ChildEventListenerがFirebaseからデータを取得することをお勧めしないと思っています。

+0

これはどちらでも動作しません。出力はありません –

1

は、問題があなたはそれがあることを期待して何をonChildAdded()になっていることは、全商品対象ではないということです。この

getReference("parts").child(curP).addChildEventListener(new ChildEventListener() { 

      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

       Products data = dataSnapshot.getValue(Products.class); 
       Log.i("", String.valueOf(data.getLoc())); 

      } 
     }); 
+0

これは試しても、まだ助けがありませんでした。DatabaseReference databaseReference = firebaseDatabase.getReference( "parts /")。child(curP); databaseReference.addChildEventListener onChildAdded(新しいChildEventListener(){ @Override公共ボイド(DataSnapshot dataSnapshot、ストリングS){ 製品データ= dataSnapshot.getValue(Products.class); tv.setText(data.getLoc()) ; } –

+0

提供された情報によると私は答えが有効だと思う。他の問題があると思うよ –

0

を試してみてください。

データベース参照では、特定の製品("parts/"+curP)をターゲットにしていますが、ChildEventListenerを使用しています。特定の製品ノードの子はname,locおよびslocです。したがってonChildAdded()が複数回トリガーされ、これらのプロパティのそれぞれがdataSnapshotとして個別に発生します。

  • 直接「部」ノードにChildEventListenerを追加し、そのノードの子として製品のそれぞれを取得します、または:

    あなたは全体のProductオブジェクトを取得するために使用するかもしれない二つのパターン

    のいずれかです;
  • リスナーを特定の製品のノードに直接追加する場合は、ValueEventListenerを使用して、そのノードエントリ全体を1つのdataSnapshotとして取得します。
+0

addValueEventListenerを使って特定の製品のノードのProductsクラスのオブジェクトを直接取得しようとしましたが、まだ出力はありません –

+0

おそらく複数の問題を抱えているようですが、この質問の情報は、私たちがこの問題を発見するのに十分なだけです。セキュリティルールのような他のものを 'Product.class'がチェックする必要がありますdataSnapshot.toString()が何かを返す場合、コンソールにエラーメッセージがあれば、正しく構築されます。 –

関連する問題