如何将Firebase数据转换为Java对象......?

问题描述 投票:51回答:5

使用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
5个回答
117
投票

还有两种方法可以将您的数据从Firebase DataSnapshot中取出,而不需要使用Map<String, Object>

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

ref = new Firebase("https://my.firebaseio.com/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) { }
});

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

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

要让它们再次脱离它,你必须做相反的事情:

ref = new Firebase("https://my.firebaseio.com/messages").limitToLast(10);
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) { }
});

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

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


10
投票

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

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

8
投票

迭代dataSnapshot的值并使用嵌套for循环获取子元素来迭代子元素的子元素并获取所需的值...

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

2
投票

你可以使用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);

0
投票

如果要将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) {

        }
    });

这会将完整的数据库结构转换为String json

© www.soinside.com 2019 - 2024. All rights reserved.