【问题标题】:How to Convert Firebase data to Java Object...?如何将 Firebase 数据转换为 Java 对象...?
【发布时间】:2015-09-05 03:39:41
【问题描述】:

使用Firebase库以Message(String, String)的形式向服务器发送数据,添加到HashMap<String, Message>

例子:

Firebase fb = new Firebase(URL);
Firebase msgRef = fb.child("finished");
HashMap<String, Message> msgList = new HashMap<>();
Message msg = new Message(m, n);
msgList.put(HASHKEY, msg);
msgRef.push().setValue(msgList);

使用 Firebase 方法接收数据时addValueEventListener() 获取此表单中的字符串

{ key = finished, value = {
    -Js9Rn0uttjYIGdcv8I1={Moosa={message=email, name=Kamran}},
    -Js9Vsmv6BnVzOzpl2L8={Moosa={message=msgs, name=Imran}}, 
    -Js9WtQ8yeDwVxQMFCZb={Moosa={message=samsung, name=Samad}}, 
    -Js9RarxoJPKn4RO2HaM={Moosa={message=Message, name=Moosa}}, 
    -Js9b6f75lwwbsqQNJz0={Moosa={message=Qmobile, name=Bilal}}, 
    -Js9aDxt8TlgTGUccuxu={Moosa={message=last, name=Moosa}}} }

如何将其转换为消息对象.....????

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    还有另外两种方法可以将您的数据从 Firebase DataSnapshot 中取出,而无需使用 Map&lt;String, Object&gt;

    第一种方法是使用DataSnapshot的方法来遍历孩子:

    ref = FirebaseDatabase.getInstance().getReference("messages").limitToLast(10);
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) {
                String name = (String) messageSnapshot.child("name").getValue();
                String message = (String) messageSnapshot.child("message").getValue();
            }
        }
    
        @Override
        public void onCancelled(FirebaseError firebaseError) { }
    });
    

    在上面的 sn-p 中,我们使用getChildren() 来获取您的消息的Iterable。然后我们使用child("name") 来获取每个特定的子属性。

    第二种方法是使用内置的 JSON-to-POJO 序列化器/反序列化器。当您发送消息列表时,其中的 Message 对象会被序列化为 JSON 并存储在 Firebase 中。

    要让他们再次摆脱困境,你必须做相反的事情:

    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) {
                Message message = messageSnapshot.getValue(Message.class);
            }
        }
    
        @Override
        public void onCancelled(FirebaseError firebaseError) { }
    });
    

    在第二个 sn-p 中,我们仍然使用 getChildren() 来获取消息,但现在我们将它们从 JSON 反序列化直接返回到 Message 对象。

    对于使用最后一种方法的简单示例应用程序,请查看Firebase's AndroidChat sample。它还展示了如何有效地处理消息列表(提示:FirebaseListAdapter)。

    【讨论】:

    • 在您的第二种方法中,firebase 数据如何映射到 pojo 的属性? pojo属性名和firebase节点名是否需要完全匹配?
    • @ParagKadam 是的,只要它们具有相同的字段名称。
    • 如果像“name”和“message”这样的属性是动态的。如何获取数据快照并生成对象。将 Json 对象直接转换为 Java 对象。
    • 您可以将值放入Map&lt;String,Object&gt;。但我建议不要这样做。如果对象是动态的,则最好坚持使用 DataSnapshot 本身。
    【解决方案2】:

    如果您想使用 Gson 库将 firebase 对象转换为 json,请使用此代码:

    databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Object object = dataSnapshot.getValue(Object.class);
                String json = new Gson().toJson(object);
                Example example= new Gson().fromJson(json, Example.class);
                Log.e("json","json: " + example.getGlossary());
            }
    
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
    
            }
        });
    

    这将使用 Gson Lib 将完整的数据库结构转换为字符串 json,然后将 json 转换为类对象

    【讨论】:

      【解决方案3】:

      您可以使用ChildEventListener 而不是ValueEventListener

      例如。我有一个名为 match 的类,具有 3 个字符串属性 {id, name, photoUrl},然后我将所有值添加到 List 中。而不是使用 for 循环,它适用于我的代码。

          Query queryRef = mDatabase.child("users").child(user.getUid()).child("matches");
      
          ChildEventListener listener = new ChildEventListener() {
              @Override
              public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
                  Match match = dataSnapshot.getValue(Match.class);
                  matchList.add(match);
                  mAdapter = new MatchAdapter(getContext(), matchList);
                  recyclerView.setAdapter(mAdapter);
              }
              @Override
              public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
                  Log.d("MESSAGEFRAGMENT", "CHILDCHANGE");
              }
              @Override
              public void onChildRemoved(DataSnapshot dataSnapshot) {
              }
      
              @Override
              public void onChildMoved(DataSnapshot dataSnapshot, String s) {
      
              }
      
              @Override
              public void onCancelled(DatabaseError databaseError) {
      
              }
          };
          queryRef.addChildEventListener(listener);
      

      【讨论】:

        【解决方案4】:

        因此,如果您想获取消息,可以执行以下操作:

                for (DataSnapshot child : dataSnapshot.getChildren()){
            //child is each element in the finished list
            Map<String, Object> message = (Map<String, Object>)child.getValue();
            Message msg = new Message((String) message.getValue().get("message"),
                    (String) message.get("name"));
        }
        

        【讨论】:

        • 它在两种情况下都返回空值... dataSnapshot.getValue(); child.getValue();
        • 你能显示你发送到firebase的请求吗?还有你用什么方法来检索数据onDataChangeonChildAdded??
        • Firebase msgRef = fb.child("messagebox"); HashMap&lt;String, Message&gt; msgList = new HashMap&lt;&gt;(); Message msg = new Message(m, n); msgList.put("Moosa", msg); msgRef.push().setValue(msgList);
        • 好的,你能检查dataSnapshotchild 的值并打印出来吗
        • 使用嵌套 for 循环并在上述解决方案的帮助下迭代子值.... Thnx Bro....
        【解决方案5】:

        迭代dataSnapshot的值并获取Children使用嵌套for循环迭代children的子元素并获取Required Value...

        for (DataSnapshot child : dataSnapshot.getChildren()) {
                            for (DataSnapshot single : child.getChildren()) {
                                Map<String, Object> map = (Map<String, Object>) single.getValue();
                                String a = (String) map.get("message");
                                String b = (String) map.get("name");
                                textView.append(b + " -- " + a + "\n");
                            }
                        }
        

        【讨论】:

          猜你喜欢
          • 2021-12-03
          • 2010-12-13
          • 1970-01-01
          • 2011-05-26
          • 1970-01-01
          • 2023-03-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多