8

プロジェクトFirebaseのデータ ストレージにを使用しており、 を使用してデータを処理しています。ただし、できるだけ効率的に行っているかどうかはわかりません。データを取得してフォーマットするためのベスト プラクティスについてアドバイスをお願いします。私のリポジトリは次のようになります....AndroidFirebase Java APIFirebase

-POLLS
    NUMPOLLS - 5
    (pollskey) - NAME - Poll1
            NUMELECTIONS - 2
            ELECTIONS 
                (electionskey) - NAME - Election1
                        NUMNOMINATIONS - 2
                        NUMVOTERS - 2
                        NUMBERTOELECT - 1
                        VOTERS - (votesrkey) - NAME - Charles
                                         NUMBER - (678) 333-4444
                                 .
                                 .
                                 .
                                 (voterskey) - ...
                        NOMINATIONS - (nominationskey) - NAME - Richard Nixon
                                              NUMBEROFVOTES - 2
                                       .
                                       .
                                       .
                                      (nominationskey) - ...
            .
            .
            .
            (electionskey) - ...
     .
     .
     .
     (pollskey) - ...

たとえば、ここでは、世論調査からすべてのデータを取得して、世論調査名、選挙名、各選挙の候補者名と投票数をリストしようとしています。DataSnapshotこのように主な活動の機能中にPOLLS レベルを取得しOnCreate()ます...

private static final Firebase polls = pollsFirebase.child("Polls");
protected void onCreate(Bundle savedInstanceState) {

        polls.addListenerForSingleValueEvent(new ValueEventListener() {

            @Override
            public void onDataChange(DataSnapshot snapshot) {
                for (DataSnapshot child : snapshot.getChildren()) {
                    if (!child.getName().equals("NumPolls")) {
                        createPollTableAndHeaders(child);
                    }
                }

            }
        });
    }

次に、 を連続して呼び出し、結果のキーをチェックすることgetValue()により、必要な個々のデータの読み取りに進みます...DataSnapshotsHashMaps

private void createPollTableAndHeaders(DataSnapshot poll) {
    String pollName = "";
    int numPolls;
    Object p = poll.getValue();
    if (p instanceof HashMap) {
        HashMap pollHash = (HashMap) p;
        if (pollHash.containsKey("Name")) {
            pollName = (String) pollHash.get("Name");
        } 
        if (pollHash.containsKey("Elections")) {
            HashMap election = (HashMap) pollHash.get("Elections");
            Iterator electionIterator = election.values().iterator();
            while (electionIterator.hasNext()) {
                Object electionObj = electionIterator.next();
                if (electionObj instanceof HashMap) {
                    HashMap electionHash = (HashMap) electionObj;
                    if (electionHash.containsKey("Name")) {
                        String electionName = (String) electionHash.get("Name");
                    }
                }
            };
        }
    }

これは、データ構造をドリルダウンするのに非常に面倒な方法のように思えます。より良い方法があるかどうか疑問に思っています。

ドキュメントでメソッドを見てきましたgetValue(java.lang.Class<T> valueType)が、プリミティブ型のコンテナーだけでなく、構成されたオブジェクトを操作しているため、私の場合は機能しませんでした。関数は、どのFirebaseデータをモデル オブジェクトのどのメンバー変数に割り当てるかをどのように認識しますか? キー名とメンバー変数を一致させますか?Firebaseしたがって、これらは大文字と小文字を区別して、まったく同じにする必要がありますか? Firebaseにプッシュするときに生成されるような、生成されたキー名をどのように処理しListますか? 合成オブジェクトのモデル オブジェクトをどのように構築しますか?

4

2 に答える 2

1

public T getValue(Class valueType)

1.クラスには、引数を取らないデフォルトのコンストラクターが必要です

2. クラスは、割り当てられるプロパティのパブリック ゲッターを定義する必要があります。インスタンスが逆シリアル化されると、パブリック ゲッターのないプロパティはデフォルト値に設定されます。

から確認してください: このソースそれはあなたを助けるでしょう

詳細

于 2016-10-18T04:15:20.270 に答える