Firebase Realtime数据库getvalue()未映射对象

时间:2019-03-06 06:34:50

标签: android firebase firebase-realtime-database

这是我的Firebase聊天结构(请参见下图)。我只想获取amitpal_name值而不是其他值,但是这种方法将我的所有值都提取了
我也曾经使用过

enter image description here

dbreference= FirebaseDatabase.getInstance().getReference( "ChatMessage" ).child( "msg");

    dbreference.orderByChild("Ref").addChildEventListener( new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {[![enter image description here][1]][1]
           Iterator iterator=dataSnapshot.getChildren().iterator();
            while (iterator.hasNext()){
                String chatis=(String) ((DataSnapshot)iterator.next()).getValue();
                Log.e( "ADDED IS-" , chatis);
            }

        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            Iterator iterator=dataSnapshot.getChildren().iterator();
            while (iterator.hasNext()){
                String chatis=(String) ((DataSnapshot)iterator.next()).getValue();
                Log.e( "ADDED chng-" , chatis);
            }
        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.e( "ERRO FBDB-", databaseError.getMessage());

        }
    } );

dbreference = FirebaseDatabase.getInstance()。getReference(“ ChatMessage”).child(“ msg”)。child(“ amitpal_name”);

但是它没有提供任何信息或值,请在这里帮助我

我也尝试使用以下方法给我带来良好的预期结果,但是主要问题是我希望在不使用服务的情况下在firebaserealtime Chat中更新数据库时更新listview中的新值,因为我需要以下方法

public void onChildChanged(@NonNull DataSnapshot dataSnapshot,@Nullable String s)

4 个答案:

答案 0 :(得分:1)

更改您的下一行

String chatis=(String) ((DataSnapshot)iterator.next()).getValue();

String chatis=((DataSnapshot)iterator.next()).getValue().toString();

下面的更新方法

    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
Log.e( "OUTER ADDED IS-" , dataSnapshot.getValue().toString());
       Iterator iterator=dataSnapshot.getChildren().iterator();
        while (iterator.hasNext()){
        DataSnapshot local = (DataSnapshot) iterator.next();
            String chatis=local.getValue().toString();
            Log.e( "Inner ADDED IS-" , chatis);
        }

    }

编辑

在引用初始化之后也在行下方

dbreference.keepSynced(true);

答案 1 :(得分:1)

这是您的参考

    refAmitPat = FirebaseDatabase.getInstance().getReference().child("ChatMessage").child("msg");

这是您的数据库参考上的子事件列表器

refAmitPat.child("amitpal_name").addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                Log.d("amitPal",dataSnapshot.getValue()+"");
                // add message value to list and call notify datasetchange method 
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                Log.d("amitPal",dataSnapshot.getValue()+"");
            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

您在做什么,错误的是,您正在迭代数据快照,而当您将消息以用户名的身份推送到用户名下时,孩子将以childAdded方法中的datasnapshot的身份获得,这意味着您正在迭代的数据快照实际上就是您的消息带有按键和消息值。因此无需进行遍历。只需调用datasnapshot.getValue()函数即可获取消息值

答案 2 :(得分:0)

请查看此帖子的答案,这可能会有所帮助: I want to list all unique childrens and keys along with values in a spinner firebase

在这里,您可以看到如何获取每个节点值,然后将其值与键一起输入。

 mUserDatabase.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {

         //"It will give you all node values:"+dataSnapshot.getKey()
        //"You can check ": 

          if(dataSnapshot.getKey()=="amitpal"){
            for (DataSnapshot childDataSnapshot2 : childDataSnapshot.getChildren()) {

         // "CHILD KEY"+childDataSnapshot2.getKey()

                arrayList.add(childDataSnapshot2.getKey());

         //"CHILD VALUES"+childDataSnapshot2.getValue()

            }}

            }

    }
    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

答案 3 :(得分:0)

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("ChatMessage" ).child( "msg").child("amitpal_name");
    ref.addValueEventListener(new ValueEventListener() {
    @SuppressLint("SetTextI18n")
    @Override
    public void onDataChange ( @NonNull final DataSnapshot dataSnapshot2){
    }
}