Java Firebase为什么onChildAdded参数s返回null

Java Firebase为什么onChildAdded参数s返回null,java,android,firebase,firebase-realtime-database,firebase-security,Java,Android,Firebase,Firebase Realtime Database,Firebase Security,我在听数据时有一个奇怪的结果 对于节点“allstudents”上的3个子节点,onchildadded方法为第0个元素返回null,但为第1个元素指定第0个pushid,依此类推 当我调整时,ID-Kjw7V4jSphLBYs7Z_wx onChildChanged会被null触发,但是,在FB控制台onChildChange上调整ID-Kjw7bRY7AkJnGpOGJEw返回的ID-Kjw7YchGZLamQmWTTc5不同为什么 logcat E/String: onChildAdde

我在听数据时有一个奇怪的结果

对于节点“allstudents”上的3个子节点,onchildadded方法为第0个元素返回null,但为第1个元素指定第0个pushid,依此类推

当我调整时,ID-Kjw7V4jSphLBYs7Z_wx onChildChanged会被null触发,但是,在FB控制台onChildChange上调整ID-Kjw7bRY7AkJnGpOGJEw返回的ID-Kjw7YchGZLamQmWTTc5不同为什么

logcat

 E/String: onChildAdded:null
 E/String: onChildAdded:-Kjw7V4jSphLBYs7Z_wx
 E/String: onChildAdded:-Kjw7YchGZLamQmWTTc5
 E/String: onChildChanged:-Kjw7YchGZLamQmWTTc5
 E/String: onChildChanged:-Kjw7V4jSphLBYs7Z_wx
 E/String: onChildChanged:null
规则:

"teachers": {
    "$teacherID": {
        ".read": "auth != null && auth.uid == $teacherID",
        ".write": "auth != null && auth.uid == $teacherID",
      ".validate":"root.child('teacherids').child(newData.child('tID').val()).exists()"
    }
},
// teachers can r/w student profiles, and the students can also r/w their own profile
"students": {
    "$studentID": {
        ".read": "auth != null && (root.child('teachers').child(auth.uid).exists() || auth.uid == $studentID)",
        ".write": "auth != null && (root.child('teachers').child(auth.uid).exists() || auth.uid == $studentID)",
        ".validate":"root.child('studentids').child(newData.child('rollnr').val()).exists()"
    }
},

 "allstudents":{
  ".read": "auth != null && (root.child('teachers').child(auth.uid).exists() || root.child('students').child(auth.uid).exists() )",
        ".write": "auth != null && (root.child('teachers').child(auth.uid).exists() || root.child('students').child(auth.uid).exists() )"

}
向节点添加数据

mDatabase.child("allstudents").push().setValue(allstudentnode);
检索/侦听数据

mDatabase.child("allstudents").addChildEventListener(new ChildEventListener() {
     @Override
     public void onChildAdded(DataSnapshot dataSnapshot, String s) {
         Log.e(TAG, "onChildAdded:"+s);
     }
     @Override
     public void onChildChanged(DataSnapshot dataSnapshot, String s) {
         Log.e(TAG, "onChildChanged:"+s);
     }

     @Override
     public void onChildRemoved(DataSnapshot dataSnapshot) {
         Log.e(TAG, "onChildRemoved:"+dataSnapshot.toString());
     }

     @Override
     public void onChildMoved(DataSnapshot dataSnapshot, String s) {
         Log.e(TAG, "onChildMoved:"+s);
     }

     @Override
     public void onCancelled(DatabaseError databaseError) {
         Log.e(TAG, "onCancelled:"+databaseError.toString());
     }
 });
试试这个

mDatabase= FirebaseDatabase.getInstance();
mDatabase.getReference("allstudents").addValueEventListener(new 
ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
              for(DataSnapshot dst : dataSnapshot.getChildren()){

                String key = dst.getKey();
                Log.e(TAG, "onChildAdded:"+key);
              }
            }

            @Override
            public void onCancelled(DatabaseError error) {

            }
        });

要在代码中使用有效数据,需要从dataSnapshot对象中获取数据,而不是使用OnChildaded方法中的字符串s

正如您在中看到的,字符串s实际上表示字符串previousChildName,这就是您在代码中使用上一个子项的方式


希望有帮助。

您是否尝试过从dataSnapshot对象中获取数据,而不是在OnChildaded方法中使用字符串s?Thanks@AlexMamo,我使用dataSnapshot获取有效数据。但是,字符串s参数的意义是什么?请参阅我的答案和对字符串s的解释。不合适,因为这将转储所有子项,只是为了对子项进行简单的更改。