Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Firebase数据转换为Java对象。。。?_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

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

如何将Firebase数据转换为Java对象。。。?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,使用Firebase库以消息(字符串,字符串)的形式向服务器发送数据添加到HashMap 例如: 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); msgR

使用Firebase库以
消息(字符串,字符串)
的形式向服务器发送数据添加到
HashMap

例如:

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

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

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

        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"));
}
for(DataSnapshot子级:DataSnapshot.getChildren()){
//子元素是完成列表中的每个元素
映射消息=(Map)child.getValue();
Message msg=新消息((字符串)Message.getValue().get(“消息”),
(字符串)message.get(“name”);
}

迭代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");
                    }
                }
for(DataSnapshot子级:DataSnapshot.getChildren()){
对于(DataSnapshot single:child.getChildren()){
Map Map=(Map)single.getValue();
字符串a=(字符串)map.get(“消息”);
stringb=(String)map.get(“name”);
textView.append(b+“--”+a+“\n”);
}
}

还有两种方法可以从Firebase
DataSnapshot
中获取数据,而无需使用
地图

第一种方法是使用
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) { }
});
在上面的代码片段中,我们使用
getChildren()
获取消息的
Iterable
。然后我们使用
child(“name”)
来获取每个特定的子属性

第二种方法是使用内置的JSON-to-POJO序列化器/反序列化器。发送消息列表时,其中的
消息
对象被序列化为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) { }
});
在第二个代码片段中,我们仍然使用
getChildren()
获取消息,但现在我们将它们从JSON反序列化为
Message
对象


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

您可以使用
ChildEventListener
而不是
ValueEventListener

比如说。我有一个名为match的类,它有3个字符串属性
{id,name,photoUrl}
,然后我在
列表中添加所有值。我不使用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);

如果要使用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转换为类对象,并在这两种情况下返回空值。。。dataSnapshot.getValue();getValue();您是否可以显示发送给firebase的请求?您使用什么方法检索数据
onDataChange
OnChildaded
firebase msgRef=fb.child(“messagebox”);HashMap msgList=新的HashMap();消息消息消息=新消息(m,n);msgList.put(“Moosa”,msg);msgRef.push().setValue(msgList)确定您可以检查
dataSnapshot
child
值并打印它们吗使用嵌套for循环并在上述解决方案的帮助下迭代子值。。。。Thnx Bro…在第二种方法中,firebase数据如何映射到pojo的属性?pojo属性名和firebase节点名是否确实需要相互匹配?@ParagKadam是的,只要它们具有相同的字段名。如果“name”和“message”等属性是动态的,该怎么办。如何获取数据快照并生成对象。直接将Json对象转换为Java对象。您可以将值转换为
映射。但我建议不要这样做。如果对象是动态的,最好还是坚持使用
DataSnapshot
本身。
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) {

        }
    });