Android - 如果数据存在则获取密钥(Firebase)

时间:2017-11-10 13:20:12

标签: android firebase firebase-realtime-database

在我的一项活动中,我将一些数据插入Firebase数据库。在另一个活动中,我想检查插入数据的子项是否存在。如果密钥存在,我想获得根唯一密钥。

问题: 我有这个数据库结构:

enter image description here

我想检查用户名子项是否存在。如果它存在,我想获得根密钥。根唯一密钥和用户名节点都标有红色。

我做了什么

  //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);
                }
        } 

但我现在不知道如何进入驱动程序节点,以及如何获取根唯一键。有什么想法吗?

3 个答案:

答案 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);
        }
    }