2017-05-09 67 views
1

我有以下的火力地堡如何獲取Firebase android中所有孩子的列表?

model

這種模式,我嘗試使用下面的代碼

databasePostsReference = 
    FirebaseDatabase.getInstance().getReference().child("posts"); 

final List<UserPostPOJO> list = Collections.EMPTY_LIST; 

    databasePostsReference.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for(DataSnapshot snapshot : dataSnapshot.getChildren()){ 
       Log.d(TAG, "onDataChange: entered list adding"); 
       UserPostPOJO post = snapshot.getValue(UserPostPOJO.class); 
       list.add(post); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

擺脫子節點職位的所有值,但我得到的錯誤java.lang.UnsupportedOperationException

在上面的場景我知道錯誤是因爲列表聲明最終,我想在onDataChangeMethod中分配值,所以是拋出錯誤,但如果我沒有聲明列表變量最後,那麼我不能訪問列表變量從內onDataChange()方法是如何解決這個

public class UserPostPOJO { 
    String uid; 
    Double elevation; 
    String uri; 
    String feel; 

    public UserPostPOJO() { 
    } 

    public UserPostPOJO(String uid, Double elevation, String uri, String feel) { 
     this.uid = uid; 
     this.elevation = elevation; 
     this.uri = uri; 
     this.feel = feel; 
    } 

    public String getUid() { 
     return uid; 
    } 

    public void setUid(String uid) { 
     this.uid = uid; 
    } 

    public Double getElevation() { 
     return elevation; 
    } 

    public void setElevation(Double elevation) { 
     this.elevation = elevation; 
    } 

    public String getUri() { 
     return uri; 
    } 

    public void setUri(String uri) { 
     this.uri = uri; 
    } 

    public String getFeel() { 
     return feel; 
    } 

    public void setFeel(String feel) { 
     this.feel = feel; 
    } 
    } 

錯誤日誌:

05-08 22:19:49.706 6421-6421/redeyes17.com.abhi.android.iamat      
    D/recentfragment: onDataChange: entered list adding 
    05-08 22:19:49.726 6421-6421/redeyes17.com.abhi.android.iamat 
    E/AndroidRuntime: FATAL EXCEPTION: main 

    Process: redeyes17.com.abhi.android.iamat, PID: 6421 

    java.lang.UnsupportedOperationException 

    at java.util.AbstractList.add(AbstractList.java:404) 

    at java.util.AbstractList.add(AbstractList.java:425) 

    at redeyes17.com.abhi.android.iamat.UI.tabs 
    .RecentFragment$1.onDataChange(RecentFragment.java:78) 

    at com.google.android.gms.internal.zzbpx.zza(Unknown Source) 

    at com.google.android.gms.internal.zzbqx.zzZT(Unknown Source) 

    at com.google.android.gms.internal.zzbra$1.run(Unknown Source) 

    at android.os.Handler.handleCallback(Handler.java:739) 

    at android.os.Handler.dispatchMessage(Handler.java:95) 

    at android.os.Looper.loop(Looper.java:158) 

    at android.app.ActivityThread.main(ActivityThread.java:7230) 

    at java.lang.reflect.Method.invoke(Native Method) 

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller 
.run(ZygoteInit.java:1230) 

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
+1

嗨Abhilash。如果你可以發佈完整的日誌和'UserPostPojo'類,這將有所幫助。乾杯! –

+0

嗨@AL。感謝回覆我在閱讀大量文章後發佈了代碼,我瞭解到firebase操作是異步操作,因此嘗試將onDataChange方法內的值分配給全局變量會在聲明全局最終您不能分配任何東西之後拋出異常以使全局變量最終生效在這裏,所以修復是做回調,當你想分配你必須使用回調分配,但我不知道如何使用回調可以請你解釋一下,如果這一切都使得無論如何 –

+0

這是解決你的問題:https:// stackoverflow.com/a/45328201/5973946 –

回答

0

要獲得所有這些值,請使用此代碼:

databasePostsReference = FirebaseDatabase.getInstance().getReference().child("posts").child(postId); 
    ValueEventListener eventListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      List<UserPostPOJO> list = new ArrayList<>(); 

      String elevation = (String) dataSnapshot.child("elevation").getValue(); 
      String feel = (String) dataSnapshot.child("feel").getValue(); 
      String uid = (String) dataSnapshot.child("uid").getValue(); 
      String uri = (String) dataSnapshot.child("uri").getValue(); 

      UserPostPOJO userPostPOJO = new UserPostPOJO(); 
      userPostPOJO.setElevation(elevation); 
      userPostPOJO.setFeel(feel); 
      userPostPOJO.setUid(uid); 
      userPostPOJO.setUri(uri); 

      list.add(userPostPOJO); 
    } 

      @Override 
      public void onCancelled(DatabaseError databaseError) {} 
}; 
databasePostsReference.addListenerForSingleValueEvent(eventListener); 

其中postId是由push()方法生成的唯一ID。請注意,您的list聲明必須位於onDataChange()方法中,否則您將得到空值。

希望它有幫助。

+0

嗨亞歷克斯最終我想出了這種方式,這個作品。我想知道是否可以將onDataChange方法中的本地列表分配給全局變量中的列表。 –

+0

很高興聽到你弄明白了。不,你不能使'list'成爲一個全局變量,因爲'onDataChange'方法是異步調用的。這意味着將數據添加到列表的語句會在調用onDataChange之前執行,並且如上所述,您將得到它'null'。如果你想更多地瞭解這一點,請訪問這[後](http://stackoverflow.com/questions/43576441/querying-data-from-firebase)和這[後](http://stackoverflow.com/問題/ 33723139 /等待 - 火力 - 異步retrive數據功能於機器人)。 –

+0

如果您認爲我的回答對您有幫助,請考慮接受它。謝謝! –

相關問題