2017-08-11 6 views
0

FirebaseDatabaseでデータに対して実行したい機能やプロセスを含むヘルパークラスを作成しました。Android - DataSnapShot - firebaseデータベースからオブジェクトを取得する

次の機能がfireabseDataBaseに投稿ノード内のすべての投稿を取得するために意図された:私は、データを得るか、ロギングながらも、私はデータをループにしようとしていますonDataChange機能に

public static Jobs getAllJobs() { 

    Posts posts= new Posts(); 
    postsDBRef= FirebaseDatabase.getInstance().getReference("posts").getRef(); 

    postsDBRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot jobSnapshot: dataSnapshot.getChildren()) { 
       // TODO: handle the post 
       String key = jobSnapshot.getKey(); 
       //here 
       Post post= jobSnapshot.child(key).getValue(Post.class); 
       // and here 
       posts.add(post); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.i(getClass().getName().toString(), ": " + databaseError.getMessage()); 
     } 
    }); 

    return posts; 
} 

をし、それを取得するが、郵便物は、ここにデータがfirebaseデータベースに

{ 
    "posts" : { 
    "-Kr9-ii-ArpC3fLuuGnb" : { 
     "address" : "sfhhfg", 
     "applied" : false, 
     "currency" : "le", 
     "description" : "ehdhyf", 
     "latitude" : 0, 
     "longitude" : 0, 
     "noOfWorkers" : 2, 
     "rating" : 0, 
     "reported" : false, 
     "salary" : "1250", 
     "title" : "rgchu", 
     "userId" : 0 
    }, 
    "-Kr94BDkdEZrmxmjxv_Z" : { 
    /../ 
    }, 
    "-Kr9Dz3S0BQEYv4VO2l3" : { 
    /../ 
    }, 
    "-Kr9XqDPUvCRcv0lwFy_" : { 
    /../ 
    } 
    } 
} 

ようになり、ここでgは午前何方法のnull

を与え続けます単一ループ内デバッガからetting

DataSnapshot {キー= -Kr9-II-ArpC3fLuuGnb、値= {アドレス= sfhhfg、 評価= 0、タイトル= rgchu、報告=偽、説明= ehdhyfは、ユーザーID = 0、 経度= 0、noOfWorkers = 2、緯度= 0、通貨=ル、適用=偽、 給与= 1250}}

私が間違っているの何任意のアイデア?いくつかの臨床試験.addChildEventListenerを使用して

.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
        Job job = snapshot.getValue(Job.class); 
        System.out.println(job.getTitle()); 
       } 
      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.i(getClass().getName().toString(), ": " + databaseError.getMessage()); 
      } 
     }); 

+0

'getDataBaseReference(" posts ")が返すものを知る方法がなく、' posts'のJSONがどのように見えるのかわかりません。質問に「問題を再現するのに必要な最小限の情報」が含まれていることを確認してください(http://stackoverflow.com/help/mcve)。 JSONを共有するときは、必ずテキストとして共有してください(スクリーンショットなし)。これは、[Firebaseデータベースコンソール](https://console.firebase.google.com/project/_/database/data)の[Export JSON]リンクをクリックすると表示されます。 –

+0

@FrankvanPuffelenは追加情報を追加しました。不足している情報を指摘してくれてありがとう –

+0

'getReference(" posts ")。getRef()' - > 'getReference(" posts ")'結果は同じですが、それは私にダブルテイクを救いました。 –

答えて

0

は、調査理由それでも、私の問題の唯一の解決策でした。

0

私はあなたのコードを編集しています。今はうまくいくはずです。以前はいくつかのプロジェクトで同じコードスニペットを使用していました。あなたのpojoがjsonデータと一致することを確認したら、thisツールを使用して自分で簡単に行うことができます。

そして最も重要なことは、値を返す関数としてFirebaseを使用しないでください。非同期のnature.makeに対してFirebaseがそのタスクを実行してから、クロージャ(ブロック)内で次の手順に進みます。

P.S:ValueEventListenerまたはChildEventListenerを使用する前に、その違いをhereからお読みください。

public void getAllJobs() { 

Posts posts= new Posts(); 

postsDBRef= FirebaseDatabase.getInstance(); 

postsDBRef.child("posts").addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot jobSnapshot: dataSnapshot.getChildren()) { 
      Post post= jobSnapshot.getValue(Post.class); 
      posts.add(post); 
     } 
    // go to next step from here e.g handlePosts(posts); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Log.i(getClass().getName().toString(), ": " + databaseError.getMessage()); 
    } 
}); 

} 
関連する問題