如何使用firebase嵌套查询设置类的属性值?

时间:2017-11-05 13:06:36

标签: java android firebase firebase-realtime-database final

我有这样的firebase数据结构 Firebase JSON Data

在Oli内部引用有一个“kategori”键(-Ky0RUaYOgB6gks2t3oY),它与Kategori引用中的子项具有相同的值(-Ky0RUaYOgB6gks2t3oY)。我正在尝试从Oli引用中检索所有数据,并使用item作为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参考中的子项(-Ky0RUaYOgB6gks2t3oY)获取“Matic”值以及此代码item.setKategoriOli(dataSnapshot.getValue(String.class));在项目类中设置kategori名称。 最后我无法获得“Matic”值,而是获得空值

也许这个问题发生了,因为AS要求我在开头的项目类中定义final,并且我试图在另一个内部类中设置kategori值。你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分: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并对其进行查询,并在另一个节点中获取数据。