如何将Firebase数据转换为Java对象...?
如何将Firebase数据转换为Java对象...?
使用Firebase库将数据以Message(String, String)
的形式发送到服务器中的HashMap
中\n例子:\n
Firebase fb = new Firebase(URL); Firebase msgRef = fb.child("finished"); HashMapmsgList = new HashMap<>(); Message msg = new Message(m, n); msgList.put(HASHKEY, msg); msgRef.push().setValue(msgList);
\n使用Firebase方法addValueEventListener()
接收数据时以以下形式获取字符串\n
{ 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}}} }
\n如何将其转换为Message对象.....????
问题出现的原因是需要将Firebase中的数据转换为Java对象。解决方法是使用嵌套循环来迭代数据快照的值,并使用子循环来迭代子元素,然后获取所需的值。
以下是解决方法的代码:
for (DataSnapshot child : dataSnapshot.getChildren()) { for (DataSnapshot single : child.getChildren()) { Mapmap = (Map ) single.getValue(); String a = (String) map.get("message"); String b = (String) map.get("name"); textView.append(b + " -- " + a + "\n"); } }
通过这段代码,可以将Firebase数据转换为Java对象并将其显示在TextView中。
问题的出现是因为在获取Firebase数据并转换为Java对象时,返回的值是null。解决方法是使用循环遍历数据快照的子元素,并将其转换为Map对象,然后再从Map对象中获取所需的值。
具体代码如下:
for (DataSnapshot child : dataSnapshot.getChildren()){ //child是数据快照的每个元素 Mapmessage = (Map ) child.getValue(); Message msg = new Message((String) message.getValue().get("message"), (String) message.get("name")); }
另外,还需要检查发送给Firebase的请求以及从中检索数据的方法是使用`onDataChange`还是`onChildAdded`。
Firebase msgRef = fb.child("messagebox"); HashMapmsgList = new HashMap<>(); Message msg = new Message(m, n); msgList.put("Moosa", msg); msgRef.push().setValue(msgList);
可以通过打印`dataSnapshot`和`child`的值来检查数据快照和子元素的内容。
`dataSnapshot`的值为:`{-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}}}`
`child`的值为:`{Moosa={message=Message, name=Moosa}} {Moosa={message=email, name=Kamran}} {Moosa={message=msgs, name=Imran}} {Moosa={message=samsung, name=Samad}} {Moosa={message=last, name=Moosa}} {Moosa={message=Qmobile, name=Bilal}}`
最后,通过使用嵌套的循环遍历子元素的值,可以获取到所需的数据。
作者将Moosa作为消息的键是因为这样可以将子元素作为Map对象获取,并从中获取名为Moosa的键对应的消息。
至于为什么选择Moosa作为键,作者表示没有特殊原因,只是作者的名字而已。
如何将Firebase数据转换为Java对象?
问题的出现原因:
在Firebase中获取数据的方法有两种,一种是使用DataSnapshot的方法遍历子节点,另一种是使用内置的JSON到POJO序列化/反序列化器。在第一种方法中,我们使用getChildren()方法获取消息的可迭代集合,然后使用child("name")方法获取每个具体的子节点属性。在第二种方法中,我们仍然使用getChildren()方法获取消息,但现在我们将它们从JSON反序列化回一个Message对象。
解决方法:
对于第一种方法,可以使用DataSnapshot的方法遍历子节点,然后使用child("name")方法获取每个具体的子节点属性。对于第二种方法,可以使用内置的JSON到POJO序列化/反序列化器,将消息对象序列化为JSON并存储在Firebase中,然后从中反序列化回一个Message对象。如果属性名不匹配,可以将值存储在一个Map
示例代码:
第一种方法:
ref = FirebaseDatabase.getInstance().getReference("messages").limitToLast(10); ref.addValueEventListener(new ValueEventListener() { public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) { String name = (String) messageSnapshot.child("name").getValue(); String message = (String) messageSnapshot.child("message").getValue(); } } public void onCancelled(FirebaseError firebaseError) { } });
第二种方法:
ref.addValueEventListener(new ValueEventListener() { public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) { Message message = messageSnapshot.getValue(Message.class); } } public void onCancelled(FirebaseError firebaseError) { } });
对于更复杂的应用程序,可以参考Firebase的AndroidChat示例,该示例演示了如何高效处理消息列表(提示:FirebaseListAdapter)。
以上就是将Firebase数据转换为Java对象的原因和解决方法。