Java 从Firebase数据库检索跨对象子对象

Java 从Firebase数据库检索跨对象子对象,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我试图从Cat1中获取重量和数量,其中Firebase Realtime DB中Cat2中的项目名称、日期和分支相同。但我不知道如何检查这些条件 JSON 到目前为止,我已经做了以下工作: mFishQuery = mFishRef.orderByChild("date").equalTo(mawStock.getDate()); // mFishQuery = mFishRef.orderByKey();//.equalTo(mawStock.getDate()); //

我试图从Cat1中获取重量和数量,其中Firebase Realtime DB中Cat2中的项目名称、日期和分支相同。但我不知道如何检查这些条件

JSON

到目前为止,我已经做了以下工作:

mFishQuery = mFishRef.orderByChild("date").equalTo(mawStock.getDate());
//        mFishQuery = mFishRef.orderByKey();//.equalTo(mawStock.getDate());
//        Query fishWeight = mFishQuery.orderByChild("item_name").equalTo(mawStock.getItem_name()).getRef().orderByChild("quantity").equalTo(mawStock.getQuantity());
mFishQuery.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        mWeightF = (Double) dataSnapshot.child("fish_weight").getValue();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

mFishRef.child("date").equalTo(mawStock.getDate()).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Cat2");
ref.orderByChild("item_name").equalTo("item1").addSingleValueEventListener(new ValueEventListener(){
  @Override
public void onDataChange(DataSnapshot dataSnapshot) {
 for(DataSnapshot datas: dataSnapshot.getChildren()){
    String date=datas.child("date").getValue().toString();

    DatabaseReference refer=FirebaseDatabase.getInstance().getReference().child("Cat1");
    refer.orderByChild("date").equalTo(date).addSingleValueEventListener(new ValueEventListener(){
         @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
       //retrieve data
      }
        @Override
    public void onCancelled(FirebaseError firebaseError) {

       }
      });
    }

  @Override
public void onCancelled(FirebaseError firebaseError) {

 }
});

基本上,您只需要执行足够的itr。接下来,直到迭代器位于第n个位置,其中n是来自nextInt的随机数,然后您可以使用getValue简单地获得所需的对象,下面的示例应该会很好地显示它:

获取随机生成密钥的解决方案

questionsRef = FirebaseDatabase.getInstance().getReference().child("questions").child("DE");

questionsRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        int questionCount = (int) dataSnapshot.getChildrenCount();
        int rand = random.nextInt(questionCount);
        Iterator itr = dataSnapshot.getChildren().iterator();

        for(int i = 0; i < rand; i++) {
            itr.next();
        }
        childSnapshot = (DataSnapshot) itr.next();
        question = childSnapshot.getValue(Question.class);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
请尝试以下操作:

mFishQuery = mFishRef.orderByChild("date").equalTo(mawStock.getDate());
//        mFishQuery = mFishRef.orderByKey();//.equalTo(mawStock.getDate());
//        Query fishWeight = mFishQuery.orderByChild("item_name").equalTo(mawStock.getItem_name()).getRef().orderByChild("quantity").equalTo(mawStock.getQuantity());
mFishQuery.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        mWeightF = (Double) dataSnapshot.child("fish_weight").getValue();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

mFishRef.child("date").equalTo(mawStock.getDate()).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Cat2");
ref.orderByChild("item_name").equalTo("item1").addSingleValueEventListener(new ValueEventListener(){
  @Override
public void onDataChange(DataSnapshot dataSnapshot) {
 for(DataSnapshot datas: dataSnapshot.getChildren()){
    String date=datas.child("date").getValue().toString();

    DatabaseReference refer=FirebaseDatabase.getInstance().getReference().child("Cat1");
    refer.orderByChild("date").equalTo(date).addSingleValueEventListener(new ValueEventListener(){
         @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
       //retrieve data
      }
        @Override
    public void onCancelled(FirebaseError firebaseError) {

       }
      });
    }

  @Override
public void onCancelled(FirebaseError firebaseError) {

 }
});
查询时,只能使用一个子项,因此只能使用一个orderByChild或orderByKey

因此,这里有子Cat2的datasnapshot,然后查询item_name=item1的位置,并从数据库中检索日期


然后添加一个嵌套侦听器,并在其中执行一个查询,其中date=date\u已检索,并检索Cat1的数据。

最后,我在@Peter Hadad的答案的帮助下解决了这个问题,并对他的答案进行了一些修改

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Cat1");
ref.orderByChild("item_name").equalTo("item1").addSingleValueEventListener(new ValueEventListener(){
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        for(DataSnapshot datas : dataSnapshot.getChildren()){

        DatabaseReference refer=FirebaseDatabase.getInstance().getReference().child("Cat1");
        refer.orderByChild("date").equalTo(date).addSingleValueEventListener(new ValueEventListener(){

            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                if (dataSnapshot.exists()) {

                    for (Datasnapshot ds : dataSnapshot) {

                        List<Datasnapshot> list = new ArrayList<>();
                        list.add(ds);

                        //compare data and apply logic

                    }

                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {

    }
});

是的,我正在努力。谢谢你的回答,伙计。它帮助我获得了一些进一步发展的逻辑。但是我仍然无法满足条件。你指的是什么条件?比如cat1.item\u name=cat2.item\u name和cat1.date=cat2.date和cat1.quantity=cat2.quantity。是的,这主要是因为你只能使用一个orderByChild,你可能需要稍微更改一下数据库。但在上面,它检查item_name是否等于cat1中的item1,并检索其他数据示例日期。然后检查cat1是否与cat2具有相同的日期,以便检索cat1Cool的数据。现在我明白了。我必须再添加一个侦听器来实现这一点。