Как преобразовать данные Firebase в объект Java...?
Использование библиотеки 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}}} }
Как я могу преобразовать его в объект сообщения.....????
Ответы
Ответ 1
Есть еще два способа получить данные из 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-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 AndroidChat. Он также показывает, как эффективно обрабатывать список сообщений (подсказка: FirebaseListAdapter
).
Ответ 2
Итак, если вы хотите получать сообщения, вы можете сделать следующее:
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"));
}
Ответ 3
Итерирование значений dataSnapshot и получение детей с помощью вложенного цикла для повторения дочерних элементов дочерних элементов и получения требуемого значения...
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");
}
}
Ответ 4
Вы можете сделать это, используя 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);
Ответ 5
Вы можете обратиться к этому ответу, если не хотите запрашивать каждый список в firebase, а скорее используете класс и имеете HashMap внутри класса
fooobar.com/questions/152403/...
Ответ 6
Используйте этот код, если вы хотите преобразовать объект 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) {
}
});
Это преобразует полную структуру базы данных в строку json
Ответ 7
Book book = dataSnapshot.getValue(Books.class); list.add (книга);
Но я получил ошибку во время выполнения :: не удалось преобразовать строку в класс Book