如何在Android Firebase数据库上获取具有相似子节点的所有父节点?

时间:2019-05-10 09:10:16

标签: java android firebase firebase-realtime-database

我的数据库的屏幕截图

enter image description here

我想通过返回具有某些相似子节点的所有父节点的名称来查询数据库。

我已经在获取一个与其孩子有关的父母的名字,但是我想获取所有具有相似孩子价值的父母的名字。

假设,我想获取子节点值为2000且评分为3-star的酒店名称。

final List<String> hotelNames = new ArrayList<String>();
final Query userQuery = FirebaseDatabase.getInstance().getReference().child("F-5").orderByChild("HotelTypeTwo");

userQuery.equalTo(varX).addListenerForSingleValueEvent(
        new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot foodSnapshot: dataSnapshot.getChildren()) {


                    hotelNames.add(foodSnapshot.getKey());


                    for (int i=0;i < hotelNames.size();i++)
                    {
                        Log.i("Value of element "+i,hotelNames.get(i));

                    }

                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        }
);

1 个答案:

答案 0 :(得分:1)

因此,要获取maxDistance等于HotelTypeTwo的所有酒店并根据您的屏幕截图作为结果:DesiIslamabad Hotel,请使用以下代码行:

Islamabad Mariott Hotel

您的logcat中的结果将是:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference fRef = rootRef.child("F-5");
Query query = fRef.orderByChild("HotelTypeTwo").equalTo("Desi");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String hotelName = ds.getKey();
            Log.d(TAG, hotelName);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
query.addListenerForSingleValueEvent(valueEventListener);

不幸的是,Firebase中不允许查询多个属性。解决方法可能是我在以下帖子中给出的答案:

但是,在Firestore compound queries中是允许的:

  

cityRef.whereEqualTo(“ state”,“ CO”)。whereEqualTo(“ name”,“ Denver”);