2017-08-11 100 views
0

我創建了一個助手類,其中包括我想對FirebaseDatabase中的數據執行的函數和過程。Android - 從DataSnapShot獲取對象 - firebase數據庫

下面的函數是爲了讓所有的帖子在帖子節點在fireabseDataBase:

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

onDataChange功能,我在數據試圖環和檢索,雖然同時記錄我得到的數據,但帖子對象不斷給空

這裏的數據看怎麼樣在火力數據庫

{ 
    "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_" : { 
    /../ 
    } 
    } 
} 

這裏就是上午摹從Debugger ETTING在單個環路

DataSnapshot {鍵= -Kr9-II-ArpC3fLuuGnb,值= {地址= sfhhfg, 評級= 0,標題= rgchu,報道=假,描述= ehdhyf,用戶id = 0, 經度= 0,noOfWorkers = 2,緯度= 0,貨幣=樂,應用=假, 工資= 1250}}

任何想法,我究竟做錯了什麼?

+0

我們無法知道'getDataBaseReference(「posts」)'返回了什麼,我們也不知道'posts'中的JSON是什麼樣的。請確保您的問題包含[重現問題所需的最低完整信息](http://stackoverflow.com/help/mcve)。當你分享JSON時,一定要將它作爲文本分享(沒有截圖)。您可以通過點擊[Firebase數據庫控制檯](https://console.firebase.google.com/project/_/database/data)中的「導出JSON」鏈接來獲取此信息。 –

+0

@FrankvanPuffelen增加了額外的信息,謝謝你指出缺失的信息 –

+0

getReference(「posts」)。getRef()' - >'getReference(「posts」)'。結果是一樣的,但它會爲我節省雙倍的費用。 –

回答

0

幾次試驗

.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()); 
      } 
     }); 

使用.addChildEventListener後是我的問題,還是調查的原因,唯一的解決辦法。

0

我編輯了你的代碼,它現在應該可以正常工作了,我之前在幾個項目中使用了相同的代碼片段。確保您的pojo與json數據相匹配,您可以使用this工具使其更容易。

並且最重要的是,不要將Firebase用作返回值的函數 - 它違背了它的異步nature.make Firebase執行它的任務,然後在閉包(塊)內轉到下一步。

P.S:使用前ValueEventListenerChildEventListenerhere中讀取它們之間的差異。

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()); 
    } 
}); 

} 
相關問題