Java 如果值已知,如何在firebase数据库中查找密钥?
我首先要检查哪个节点具有当前用户的userid。这一步很好。它给出了正确的值。然后下一步,我想在该节点(1或2)中搜索,以查找该节点中的哪个userid有一个名为“type”的子节点,该子节点的值为“driver”。我想查找具有type=“driver”的用户标识 当前代码为Java 如果值已知,如何在firebase数据库中查找密钥?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我首先要检查哪个节点具有当前用户的userid。这一步很好。它给出了正确的值。然后下一步,我想在该节点(1或2)中搜索,以查找该节点中的哪个userid有一个名为“type”的子节点,该子节点的值为“driver”。我想查找具有type=“driver”的用户标识 当前代码为 mDatabaseReference = FirebaseDatabase.getInstance().getReference(); busReference = mDatabaseReference.child("B
mDatabaseReference = FirebaseDatabase.getInstance().getReference();
busReference = mDatabaseReference.child("Busno");
mUser = FirebaseAuth.getInstance().getCurrentUser();
assert mUser != null;
userid = mUser.getUid();
busReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()){
usercount = ds.getChildrenCount();
for(int i = 1; i <= usercount; i++){
if(ds.hasChild(userid)){
busno = ds.getKey();
driverReference = mDatabaseReference.child("Busno").child(busno);
driverReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds1 : dataSnapshot.getChildren()) {
// I need help in this place.
}
}
@Override
public void onCancelled(DatabaseError databaseError) { }
});
break;
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) { }
});
mDatabaseReference=FirebaseDatabase.getInstance().getReference();
busReference=mDatabaseReference.child(“Busno”);
mUser=FirebaseAuth.getInstance().getCurrentUser();
断言缪斯无效的
userid=mUser.getUid();
busReference.addListenerForSingleValueEvent(新值EventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot ds:DataSnapshot.getChildren()){
usercount=ds.getChildrenCount();
对于(int i=1;i要获取子密钥,请尝试:
ds1.getKey();
要获取子密钥,请尝试:
ds1.getKey();
使用查询查找驱动程序:
DatabaseReference busRef = ds.getRef(); // no need to rebuild this ref, but I'd recommend rename ds to something more meaningful
Query driverQuery = busRef.orderByKey("type").equalTo("driver");
driverQuery.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot driverSnapshot : dataSnapshot.getChildren()) {
System.out.println(driverSnapshot.getKey());
}
}
...
这是可行的,但我建议认真重新思考您的数据结构。利用您所在领域的数据模型,为您的用例提供一个高效的结构
例如:如果一条总线只能有一个驱动程序,为什么不确定驱动程序作为每个总线的属性作为顶级集合:
drivers: {
"1": "mlxMu..."
}
这样,您就可以直接查找驱动程序,而不必查询它们:
Query driverRef = ref.getChild("drivers").getChild(busno);
driverQuery.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println(dataSnapshot.getValue(String.class));
}
...
事实上,使用这种数据结构,将驱动程序列表保存在内存中并避免嵌套的侦听器可能非常可行。这大大提高了代码的可读性/可维护性。使用查询来查找驱动程序:
DatabaseReference busRef = ds.getRef(); // no need to rebuild this ref, but I'd recommend rename ds to something more meaningful
Query driverQuery = busRef.orderByKey("type").equalTo("driver");
driverQuery.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot driverSnapshot : dataSnapshot.getChildren()) {
System.out.println(driverSnapshot.getKey());
}
}
...
这是可行的,但我建议认真重新思考您的数据结构。利用您所在领域的数据模型,为您的用例提供一个高效的结构
例如:如果一条总线只能有一个驱动程序,为什么不确定驱动程序作为每个总线的属性作为顶级集合:
drivers: {
"1": "mlxMu..."
}
这样,您就可以直接查找驱动程序,而不必查询它们:
Query driverRef = ref.getChild("drivers").getChild(busno);
driverQuery.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println(dataSnapshot.getValue(String.class));
}
...
事实上,使用这种数据结构,将驱动程序列表保存在内存中并避免嵌套的侦听器可能是非常可行的。这大大提高了代码的可读性/可维护性。但是我想要一个名为type的子键,该子键的值应该是“driver”而不是“parent”.所以,我只想要驾驶执照userid@AjayReal执行此逻辑,获取ds1类型并检查是否为驱动程序,如果是,则获取密钥,否则不要执行类似操作:String type=ds1.child(“type”).getValue(String.class);if(type.equals(“driver”){//get key}但我想要具有名为type的子项的子项,其值应为“driver”而不是“parent”.所以,我只想要驾驶执照userid@AjayReal执行此逻辑,获取ds1类型并检查是否为驱动程序,如果是,则获取密钥,否则不执行类似操作:String type=ds1.child(“type”).getValue(String.class);if(type.equals(“driver”){//get key}你找到答案了吗?如果没有,我会发布我的。@UmarZaii请发布你的答案你找到答案了吗?如果没有,我会发布我的。@UmarZaii请发布你的答案