64

Firebase Library を使用して、に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);

addValueEventListener()このフォームで文字列を取得するFirebaseメソッドでデータを受信して​​いる間

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

どうすればメッセージオブジェクトに変換できますか.....????

4

5 に答える 5

126

DataSnapshotを使用せずに Firebase からデータを取得する方法が 2 つありますMap<String, Object>

最初のアプローチは、メソッドを使用し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")、特定の子プロパティを取得するために使用します。

2 番目の方法は、組み込みの JSON-to-POJO シリアライザー/デシリアライザーを使用することです。メッセージ リストを送信すると、そのMessage中のオブジェクトが 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) { }
});

この 2 番目のスニペットでは、引き続き を使用getChildren()してメッセージを取得しますが、JSON からオブジェクトに直接デシリアライズしMessageます。

最後のアプローチを使用した簡単なサンプル アプリケーションについては、Firebase の AndroidChat サンプルをご覧ください。また、メッセージのリストを効率的に処理する方法も示します (ヒント: FirebaseListAdapter)。

于 2015-06-19T16:35:16.437 に答える
11

したがって、メッセージを取得したい場合は、次のことができます。

        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"));
}
于 2015-06-19T09:22:58.407 に答える
9

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");
                    }
                }
于 2015-06-19T10:22:11.353 に答える
2

ChildEventListenerの代わりにを使用して作成できますValueEventListener

例えば。3 つの文字列プロパティを持つ match というクラスがあり、{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);
于 2016-08-06T13:57:34.740 に答える