2017-11-05 6 views
2

私はこの Firebase JSON DataFirebaseネストされたクエリを使用してクラスのプロパティ値を設定するにはどうすればよいですか?

インサイドオリの参照などのfirebaseデータ構造を持っているKategori参照(-Ky0RUaYOgB6gks2t3oY)に子として同じ値を持っている「kategori」キー(-Ky0RUaYOgB6gks2t3oY)があります。私はOli参照からすべてのデータを取得しようとしており、DataOliクラスとして項目を使用してarraylistに値を設定しています。

mDbRefOli.orderByChild("nama").addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) { 
       final DataOli item = new DataOli(); 
       item.setIdOli(childDataSnapshot.getKey()); 
       item.setNamaOli(childDataSnapshot.child("nama").getValue().toString()); 
       mDbRefKategori.child(childDataSnapshot.child("kategori").getValue().toString()).child("nama").addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         item.setKategoriOli(dataSnapshot.getValue(String.class)); 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }); 
       mDbRefMerk.child(childDataSnapshot.child("merk").getValue().toString()).child("nama").addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         item.setMerkOli(dataSnapshot.getValue(String.class)); 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }); 
       item.setJenisOli(Integer.parseInt(childDataSnapshot.child("jenis").getValue().toString())); 
       item.setHargaOli(Integer.parseInt(childDataSnapshot.child("harga").getValue().toString())); 
       item.setKapasitasOli(Double.parseDouble(childDataSnapshot.child("kapasitas").getValue().toString())); 
       mListOli.add(item); 
      } 
      mAdapterOli.notifyDataSetChanged(); 
      mSwlOli.setRefreshing(false); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 

代わりにそのキーを取得し、それをユーザーに表示する、私は項目にkategori名を設定するには、このコードitem.setKategoriOli(dataSnapshot.getValue(String.class));とともにKategori参照子(-Ky0RUaYOgB6gks2t3oY)から「マチック」の値を取得しようとしていますクラス。 最後に私はその "Matic"値を得ることができません、代わりにnull値を得ました。

ASが最初にアイテムクラスでfinalを定義する必要があり、別の内部クラスの中にカテゴリ値を設定しようとしているので、この問題が発生した可能性があります。この問題を解決するのを手伝ってくれますか?

+0

正確に何を検索しますか? –

+0

@PeterHaddad Oliのデータ(ID、nama、kategori、merkなど)のすべてのデータですが、Oliのデータのカテゴリ値の代わりにカテゴリ参照(「Matic」など)の値を取得したい場合もあります – Yoel

答えて

1
//declare the Strings before 


DatabaseReference newtables = FirebaseDatabase.getInstance().getReference().child("Oli"); 
newtables.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      values = dataSnapshot.child("harga").getValue().toString(); 
jenis=dataSnapshot.child("jenis").getValue().toString(); 
kap=dataSnapshot.child("kapasitas").getValue().toString(); 
kat=dataSnapshot.child("kategori").getValue().toString(); 
merk=dataSnapshot.child("merk").getValue().toString(); 
nama=dataSnapshot.child("nama").getValue().toString(); 
      DatabaseReference 
joins=FirebaseDatabase.getInstance().getReference().child("Kategori"); 
joins.orderByKey().equalTo(kat).addChildEventListener(new ChildEventListener() { 
        @Override 
        public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
         retrieve = dataSnapshot.child("nama").getValue().toString(); 

        } 

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

        } 

        @Override 
        public void onChildRemoved(DataSnapshot dataSnapshot) { 

        } 

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

        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }); 

     } 

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

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

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

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

あなたがこれを行うことができ、そのはjoinのように最初に1つのノードからデータを取得し、その後、あなたはそれにidとクエリを使用し、他のノードにデータを取得します。

+0

値を文字列に割り当てる方法私は(onChildAddedのような)内部クラスの冒頭に定義していますが、javaでは文字列を宣言する前にfinalを使用する必要がありますか? – Yoel

+0

私は理解していませんでした。私はデータベースからデータを取得しています。データを別のクエリでデータベースに送信する必要があります。はい、最終的に@Yoelを使用する必要があります。 –

+0

実際にすべてのデータがあります。私はそれをクラスに設定し、クラスをアーライルリストの中に入れなければなりません。 – Yoel

関連する問題