在我的一项活动中,我将一些数据插入Firebase数据库。在另一个活动中,我想检查插入数据的子项是否存在。如果密钥存在,我想获得根唯一密钥。
问题: 我有这个数据库结构:
我想检查用户名子项是否存在。如果它存在,我想获得根密钥。根唯一密钥和用户名节点都标有红色。
我做了什么
//variable username is the actual username of the current user
userRef.child(sharedPreferences.getString("school", null)).child("routes").orderByChild("username").equalTo(username).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String key=ds.getKey();
System.out.println("key" + key);
}
}
但我现在不知道如何进入驱动程序节点,以及如何获取根唯一键。有什么想法吗?
答案 0 :(得分:1)
if(ds.hasChild("drivers")){
String key=ds.getKey();
}
你可以这样做:
userRef.child("routes").orderByChild("username").equalTo("jju").addListenerForSingleValueEvent(...){ //code here }
编辑:
userRef.child("routes").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
if(ds.hasChild("driver"){
for(DataSnapshot data : ds.getChildren()){
if(data.child("username").exists()){
String key=ds.getKey();
System.out.println("key" + key);
}
}
}
}
}
答案 1 :(得分:1)
是的,您可以使用exists()
方法。
userRef.child("routes").child(routeId).child("drivers").child(userName).addListenerForSingleValueEvent(new
ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
//do something
}
}
如果您要验证所有路线username
的存在,假设routes
节点是您的Firebase数据库的直接子节点,请使用以下代码:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference routesRef = rootRef.child("routes");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
if(ds.child("drivers").child(userName).exists()) {
//do what you want
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
routesRef.addListenerForSingleValueEvent(eventListener);
其中userName
是您要检查的用户的名称。
答案 2 :(得分:1)
你快到了。您可以传递orderByChild()
的路径来过滤该路径上的属性。所以:
userRef.child(sharedPreferences.getString("school", null))
.child("routes").orderByChild("drivers/username").equalTo(username).addListenerForSingleValueEvent(new ValueEventListener() {
现在,将使用具有所需用户名的所有节点的快照调用您的onDataChange
。因此,循环遍历它们并打印与您的相同:
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String key=ds.getKey();
System.out.println("key" + key);
}
}