2015-06-19 6 views
38

Используя Firebase библиотеку для отправки данных на сервер в виде Message(String, String) добавленного к HashMap<String, Message>Как преобразовать данные Firebase в объект Java ...?

Пример:

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}}} } 

Как преобразовать его в Message Object ..... ????

ответ

91

есть еще два способа, чтобы получить данные из Firebase DataSnapshot, которые не требуют использования Map<String, Object>.

Первый appoach является использовать методы 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's AndroidChat sample. Он также показывает, как эффективно обрабатывать список сообщений (подсказка: FirebaseListAdapter).

+1

В вашем втором подходе, как данные о базе данных отображаются в свойствах из pojo? Является ли имя свойства pojo и имя узла firebase точно соответствовать друг другу? –

+2

@ParagKadam да, поскольку у них одинаковые имена полей. –

+1

Что делать, если атрибуты типа «имя» и «сообщение» являются динамическими. как получить снимок данных и сгенерировать объект. Преобразовать объект Json в объект Java напрямую. –

5

Так что если вы хотите получить сообщения, которые вы можете сделать следующее:

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

Its Возвращая null значение в обоих условиях ... dataSnapshot.getValue(); child.getValue(); –

+0

Можете ли вы показать запрос на отправку в firebase? Также какой метод вы используете для извлечения данных 'onDataChange' или' onChildAdded' ?? – M090009

+0

с использованием метода 'onDataChange' для извлечения данных ... –

8

итерацией значение 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"); 
        } 
       } 
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); 
1

Вы можете обратиться к этому ответу, если вы не хотите, чтобы запросить для каждого списка в firebase и скорее вы используете класс и есть HashMap внутри класса

https://stackoverflow.com/a/46486441/5611166

+0

Чувак, я думаю, что ты слишком поздно, это почти 2 года, 3 месяца, 9 дней, 23 часа, 37 минут и 35 секунд назад, когда я получил ответ от Фрэнка Ван, и я тоже принял его ... –

+0

Привет, , я искал решение и наткнулся на это. я нашел и разместил его, может помочь кому-то другому, кто ищет. Приветствия! @MoosaBaloch –