Получить перекрестный дочерний объект из базы данных Firebase - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь получить weight и quantity из Cat1, где item_name, date и branch совпадают в Cat2 в БД Firebase Realtime. Но я не знаю, как проверить условия для этого.

JSON

"Cat1" : {
    "-LBBWypuYLVn-aDYWK-N" : {
      "branch" : "b1",
      "date" : "28/Apr/2018",
      "weight" : "46",
      "item_name" : "item1",
      "quantity" : "20"
    },
    "-LBBZKUlEJB-HdiKftoj" : {
      "branch" : "b2",
      "date" : "28/Apr/2018",
      "weight" : "112",
      "item_name" : "item2",
      "quantity" : "16"
    }
  },
"Cat2" : {
    "-LBBWQcC3acYk-OOiX3T" : {
      "branch" : "b1",
      "date" : "28/Apr/2018",
      "item_name" : "item1",
      "weight" : "2.7",
      "quantity" : "20"
    }
  }

Пока я сделал следующее:

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) {

    }
});

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Попробуйте следующее:

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, затем вы запрашиваете where item_name=item1 и извлекаете date из базы данных.

Затем вы добавляете вложенный прослушиватель и делаете запрос where date= date_retrieved и извлекаете данные Cat1.

0 голосов
/ 06 мая 2018

Наконец я решил проблему с помощью ответа @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) {

    }
});
0 голосов
/ 28 апреля 2018

По сути, вам просто нужно сделать достаточно itr.next(), пока итератор не окажется на n-й позиции (где n - случайное число из nextInt()), а затем вы можете просто получить нужный объект с помощью getValue() , пример ниже должен хорошо это показать:

Sample data

Решение для получения случайных сгенерированных ключей.

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) {

    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...