Java 检索firebase数据库时,子节点值为null

Java 检索firebase数据库时,子节点值为null,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我试图检索数据库值,但我使用uID获取的节点/子节点中的数据为空。 这是我的密码- Intent intent = getIntent(); Bundle extras = intent.getExtras(); currentUser = extras.getString("currentUser"); selectedUser = extras.getString("selectedUser");

我试图检索数据库值,但我使用uID获取的节点/子节点中的数据为空。 这是我的密码-

    Intent intent = getIntent();
            Bundle extras = intent.getExtras();
            currentUser = extras.getString("currentUser");
            selectedUser = extras.getString("selectedUser");
            uID = extras.getString("uID");
    mFirebaseDatabase = FirebaseDatabase.getInstance();


mDbReference = FirebaseDatabase.getInstance().getReference();
    final DatabaseReference uidRef = mDbReference.child("users").child(uID);

    ValueEventListener valueEventListener = new ValueEventListener() {


@Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                ChatMessageModel chatMessageModel = ds.getValue(ChatMessageModel.class);
                Log.d(TAG, "onDataChange: " + uidRef);
                Log.d("users:: ", chatMessageModel.getMsgContent());
                    messageList.add(chatMessageModel);
                    for (int i = 0; i < messageList.size(); i++) {
                        Log.d(TAG, "All received messages : " + messageList.get(i).getMsgContent());

                    }
                }
                chatAppMsgAdapter.notifyDataSetChanged();
                //Do what you need to do with the list.
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d(TAG, databaseError.getMessage());
            }
        };
        uidRef.addListenerForSingleValueEvent(valueEventListener);
Intent-Intent=getIntent();
Bundle extras=intent.getExtras();
currentUser=extras.getString(“currentUser”);
selectedUser=extras.getString(“selectedUser”);
uID=extras.getString(“uID”);
mFirebaseDatabase=FirebaseDatabase.getInstance();
mDbReference=FirebaseDatabase.getInstance().getReference();

最终数据库引用uidRef=mDbReference.child(“用户”).child(uID); ValueEventListener ValueEventListener=新的ValueEventListener(){ @凌驾 公共void onDataChange(DataSnapshot DataSnapshot){ 对于(DataSnapshot ds:DataSnapshot.getChildren()){ ChatMessageModel ChatMessageModel=ds.getValue(ChatMessageModel.class); Log.d(标签“onDataChange:+uidRef”); Log.d(“用户::”,chatMessageModel.getMsgContent()); messageList.add(chatMessageModel); 对于(int i=0;i
//这是我的数据库
u0TddklO8BXKCRHp4UFXEvmPS1H3:null
//u0TddklO8BXKCRHp4UFXEvmPS1H3是uid。其中,uid是currentuser。

假设
user1
是第一个用户对应的
uid
,要获取
ChatMessageModel
节点下的所有
user1
对象,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference uidRef = rootRef.child("users").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        ArrayList<ChatMessageModel> messageList = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            ChatMessageModel chatMessageModel = ds.getValue(ChatMessageModel.class);
            Log.d("users:: ", chatMessageModel.getMsgContent());
            messageList.add(chatMessageModel);
        }

        //Do what you need to do with the list.
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
uidRef.addListenerForSingleValueEvent(valueEventListener);
DatabaseReference rootRef=FirebaseDatabase.getInstance().getReference();
字符串uid=FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference uidRef=rootRef.child(“用户”).child(uid);
ValueEventListener ValueEventListener=新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
ArrayList messageList=新建ArrayList();
对于(DataSnapshot ds:DataSnapshot.getChildren()){
ChatMessageModel ChatMessageModel=ds.getValue(ChatMessageModel.class);
Log.d(“用户::”,chatMessageModel.getMsgContent());
messageList.add(chatMessageModel);
}
//对列表执行您需要执行的操作。
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
Log.d(标记,databaseError.getMessage());
}
};
uidRef.addListenerForSingleValueEvent(valueEventListener);
  • 首先,通过如下设置Firebase数据库规则,尝试调试应用程序-

    {
       "rules": {
       ".read": true,
       ".write": true
       }
    } 
    
  • 如果不起作用,试着这样做-

    private FirebaseDatabase database;
    private DatabaseReference databaseRef;
    
    database = FirebaseDatabase.getInstance();
    databaseRef = database.getReference("users");
    
    databaseRef.addValueEventListener(new ValueEventListener() {
         @Override
         public void onDataChange(DataSnapshot dataSnapshot) {
             for(DataSnapshot snapshot:dataSnapshot.getChildren()){
                Log.d("Output Key", snapshot.getKey());
                Log.d("Output Value", snapshot.getValue().toString());
            }
         }
         @Override
         public void onCancelled(DatabaseError databaseError) {
    
         }
    });
    

  • 嘿,我尝试了上述解决方案,但我面临同样的问题。错误为-java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“com.google.firebase.database.DatabaseReference com.google.firebase.database.DatabaseReference.child(java.lang.String)”。但是在我的例子中UID的值不是null.DatabaseReference uidRef=mdbreeference.child(“用户”).child(UID);这一行返回null。请用更新的代码编辑您的问题,以便更清楚地看到问题。您好,我编辑了代码,解决了null指针问题。但检索到的子项为空。事实上,您得到了另一个错误,这意味着初始错误消失了,这是个好消息:)但这听起来是一个新问题,基本上应该被视为另一个问题,我无法在评论中回答或仅使用上述数据。作为个人猜测,我认为您使用了错误的数据库引用,但为了遵守此社区的规则,请使用发布另一个新问题,以便我和其他用户可以帮助您。嘿,我尝试了上述解决方案,但我面临相同的问题。错误为-java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“com.google.firebase.database.DatabaseReference com.google.firebase.database.DatabaseReference.child(java.lang.String)”。但是UID的值在我的例子中不是空的。你能把你的完整代码放进去吗??我希望您将databaseRef声明为一个全局变量,并在onCreate方法中初始化它。这就是我试图从之前的活动中获取值的原因,之后我定义了databaseRef,并声明databaseRef是全局的。非常感谢你的帮助。