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

Posted

技术标签:

【中文标题】Firebase实时数据库getvalue()未映射对象【英文标题】:Firebase Realtime database getvalue() not mapping the object 【发布时间】:2019-07-27 18:10:01 【问题描述】:

这是我的 Firebase 聊天结构(见下图)。我只想获取 amitpal_name 值而不是其他值,但是这种方法可以获取我所有的值 我也用过这个

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)

【问题讨论】:

你试过这样引用吗 dbreference= FirebaseDatabase.getInstance().getReference().child("ChatMessage" ).child( "msg").child("amitpal_name"); 是的,我在上面写了它,我正在使用它,但它没有为我提供任何价值 哈哈,我知道我读过。请注意 getReference() 没有参数 不工作 tnx 【参考方案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.getValue() 函数即可获取消息值

【讨论】:

【参考方案2】:

更改下面的行

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

【讨论】:

是的,我试过了,但是当我使用 dbreference= FirebaseDatabase.getInstance().getReference( "ChatMessage" ).child( "msg") 时,它给了我价值,而不是当 dbreference= FirebaseDatabase.getInstance( ).getReference("ChatMessage").child("msg").child("amitpal_name"); 你想要什么?? 我只想要 amitpal_name 值而不是另一个 @SunilChaudhary 哪里坏了??我可以看到 amitpal_name 有多个值。你想阅读所有这些吗? 是的,我想要它没有破坏的所有值,但在使用 dbreference= FirebaseDatabase.getInstance().getReference("ChatMessage").child("msg").child("amitpal_name ")【参考方案3】:

查看这篇文章的答案,这可能会有所帮助: 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) 

    
);

【讨论】:

我已经澄清了,大写字母对不起。?谢谢你告诉我。? 不客气。 (如果看到.. 标记我的移除并移除你的,以便我们停止混乱;-))。【参考方案4】:
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)
    

【讨论】:

以上是关于Firebase实时数据库getvalue()未映射对象的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Firestore:如何在 Android 上将文档对象转换为 POJO

Firebase 实时数据库未更新 // 数据未添加到 Firebase 实时数据库

如何将我的 Firebase 实时数据库转移到 Firebase Cloud Firestore

如何将我的 Firebase 实时数据库转移到 Firebase Cloud Firestore

如何使用 Firebase 实时数据库?

多个用户的 Firebase 实时数据库身份验证