2017-11-05 3 views
2

는 I이 Firebase JSON Datafirebase 중첩 쿼리를 사용하여 클래스의 속성 값을 설정하는 방법은 무엇입니까?

내부 OLI 참조 같은 중포 기지 데이터 구조가 "kategori"키 Kategori 참조 (-Ky0RUaYOgB6gks2t3oY)의 자식으로 동일한 값을 가지고있다 (-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, 숫자, 카테고리, merk 등)하지만 Oli의 데이터에서 kategori 값 대신 카테고리 참조 (예 : "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 먼저 당신은 하나 개의 노드에서 데이터를 검색 그것처럼 그리고 당신은 다른 노드의 데이터를 그것에 id 및 쿼리를 사용하여 얻을.

+0

문자열에 값을 할당하는 방법 내부 클래스 (onChildAdded 같은) 내에서 처음에 정의한, 자바 문자열을 선언하기 전에 최종 사용하여 날 필요합니까? – Yoel

+0

나는 데이터베이스에서 데이터를 가져 오는 메신저를 게시 한 답을 이해하지 못했습니다. 다른 쿼리의 데이터베이스에 데이터를 보내야합니다. 예. 마지막으로 사용해야합니다. @Yoel –

+0

실제로 모든 데이터가 있지만 나는 그것을 수업에 넣고 수업을 arraylist 안에 넣어야한다. – Yoel

관련 문제