【问题标题】:How to get the list of all children in Firebase android?如何获取 Firebase android 中所有孩子的列表?
【发布时间】:2017-05-09 01:14:00
【问题描述】:

我在 Firebase 下面有这个模型

我正在尝试使用以下代码从子节点帖子中获取所有值

  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

在上述情况下,我知道错误是因为 list 被声明为 final,并且我试图在 onDataChangeMethod 中赋值,所以会抛出错误,但如果我没有将 list 变量声明为 final,那么我无法从 onDataChange 中访问 list 变量() 方法怎么解决这个问题

  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)

【问题讨论】:

  • 嗨阿比拉什。如果您可以发布完整的日志和UserPostPojo 课程,那将会有所帮助。干杯!
  • 嗨@AL。感谢您的回复 我在阅读了很多文章后发布了代码 我了解到 firebase 操作是异步操作,因此尝试将 onDataChange 方法内部的值分配给全局变量会引发异常以在声明 global final 后使全局变量 final 你不能分配任何东西在这里,所以修复是进行回调,当你想分配时,你必须使用回调来分配,但我不知道如何使用回调,如果这一切都有意义,请你解释一下
  • 这可以解决您的问题:stackoverflow.com/a/45328201/5973946

标签: android firebase firebase-realtime-database


【解决方案1】:

要获取所有这些值,请使用以下代码:

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

其中postIdpush()方法生成的唯一id。请注意,list 的声明必须在 onDataChange() 方法内,否则,您将得到 null。

希望对你有帮助。

【讨论】:

  • 嗨亚历克斯最终我想通了这种方式,这行得通。我想知道我们是否可以将 onDataChange 方法中的本地列表分配给全局变量中的列表。
  • 很高兴听到您想通了。不,您不能将 list 设为全局变量,因为 onDataChange 方法是异步调用的。这意味着将数据添加到列表中的语句在调用onDataChange 之前执行,并且如前所述,您将得到它null。如果您想了解更多关于此的信息,请访问此post 和此post
  • 如果您认为我的回答对您有帮助,请考虑采纳。谢谢!
  • 我试图接受它但不能接受,因为如果我的问题有效,我的声誉很低,请投票,如果你不介意回答,我还有一个问题。我有这个firebase孩子,他的孩子都是按键如何按升序和降序对它们进行排序,基本上想检索最近的,但是当我放入回收器视图时,最近的一个正在移动到回收器视图的末尾如何处理这个
  • 默认情况下,这些键是按升序排列的。要过滤 Firebase 中的数据,请访问 offical doc。你不能投票,因为声誉低,但you can accept it。请考虑click on the check mark beside the answer 将其从灰色切换为填充。谢谢!
猜你喜欢
  • 2022-01-08
  • 2018-03-12
  • 1970-01-01
  • 2021-05-30
  • 2021-08-17
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多