java在不知道Firebase实时数据库键值的情况下检索子值
我想获取父键值,其中“drinkManufacturerID”等于currentUsers UID
。然而,我不知道VenueID
或PushID
的值(见下文)。在不知道这些值的情况下,如何检查“drinkManufacturerID”的值是否相等。不重组我的数据库有可能吗
相关代码:
public class DealRawDataActivity extends AppCompatActivity {
DatabaseReference databaseDrinks;
DatabaseReference databaseManufacturer;
String keys;
FirebaseUser currentFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_deal_raw_data);
databaseDrinks = FirebaseDatabase.getInstance().getReference("drinks").child("-LWLuM2nesg0uaP0dLSn"); //However, this string will not be know! How to get this string value?
//To later be used in listView
databaseDrinks.orderByChild("drinkManufacturerID").equalTo(currentFirebaseUser.getUid()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot datas : dataSnapshot.getChildren()) {
keys = datas.getKey();
}
Toast.makeText(getApplicationContext(), keys, Toast.LENGTH_LONG).show();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
//databaseManufacturer = FirebaseDatabase.getInstance().getReference("drinks").child(keys);
}
}
数据库结构:
# 1 楼答案
您需要知道
VenueID
的值,以便至少能够查询数据库中的-LWLuM2nesg0uaP0dLSn
节点。下面的问题是:只有能为你提供该特定物体内的所有饮料
不,不幸的是,在Firebase中无法查询两个或多个Firebase节点,在树的两层深处,正如您所希望的那样。要解决这个问题,你应该复制你的数据。这种做法被称为
denormalization
,是Firebase的常见做法。如果你是NoQSL数据库的新手,我建议你看这个视频,Denormalization is normal with the Firebase Database以便更好地理解此外,在复制数据时,有一件事需要记住。与添加数据的方式相同,您也需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都这样做
这样说,在您的特定情况下,您应该考虑通过创建另一个名为^ {CD4>}的节点来允许您的数据结构进行反向查找,在这里您应该将对象添加为所有对应的^ {< CD5>}对象。因此,您的数据库结构应该类似于:
使用此模式,您可以使用以下代码行简单地查询数据库以获取所有饮料,其中
drinkManufacturerID
等于uid
:如果你想从特定的酒庄获得所有饮料,只需使用:
其中
VenueID
可能包含类似-LWLuM2nesg0uaP0dLSn
的值# 2 楼答案
你的代码还可以,但它适用于uid或其他任何类型的所有孩子。但是当你需要孩子的时候
我的意思是,如果UID有3个孩子,例如 UID>;(儿童1)、(儿童2)、(儿童3)
每个孩子都有自己的孩子
UID>;(儿童1)>;(childA),(childB)
。。。。。。(儿童2)>;(childC),(childD)
。。。。。。(儿童3)>;(childD),(childE)
这些child中的child(childA,childB,childC,childD,childE)保存着数据 你需要在不知道父密钥和子密钥的情况下得到它,这很容易,兄弟。 你只需要这么做
就用你的代码吧