【问题标题】:Cannot read data in Firebase Database as list无法将 Firebase 数据库中的数据读取为列表
【发布时间】:2016-11-03 10:13:02
【问题描述】:

firebase中的数据如下

我想将标记为 userId 的数据作为列表或数组获取。

我的方法是:

public static void writePostToFriends(final String userId, final String userName, final String title, final String body, final String authorPhoto){
    DatabaseReference mpostRef = FirebaseDatabase.getInstance().getReference().child("social/user/"+userId+"/friends");
    mpostRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            GenericTypeIndicator<List<Friends>> t = new GenericTypeIndicator<List<Friends>>() {};
            List<Friends> mFriends = dataSnapshot.getValue(t);
            long j = mFriends.size();
            for (long i = 0; i == j; i++){
                Friends mReadFriends = dataSnapshot.getValue(Friends.class);
                String getUid = mReadFriends.userID;
                writeNewPost(getUid, userId, userName, title, body, authorPhoto);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

但是当它尝试读取时会出现此错误 -

进程:com.evolutionstudios.atmiyo,PID:19506 com.google.firebase.database.DatabaseException:反序列化时需要一个列表,但得到一个类 java.util.HashMap 在 com.google.android.gms.internal.zzanp.zza(未知来源) 在 com.google.android.gms.internal.zzanp.zza(未知来源) 在 com.google.android.gms.internal.zzanp.zza(未知来源) 在 com.google.firebase.database.DataSnapshot.getValue(未知来源) 在 com.evolutionstudios.atmiyo.Utils.NotificationHelper$1.onDataChange(NotificationHelper.java:40) 在 com.google.android.gms.internal.zzakg.zza(未知来源) 在 com.google.android.gms.internal.zzalg.zzcxk(未知来源) 在 com.google.android.gms.internal.zzalj$1.run(未知来源) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148)

谁能帮我弄清楚如何以数组或列表的形式获取数据中的用户 ID?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    错误信息包含它的要点:

    反序列化时需要一个列表,但得到了一个类 java.util.HashMap

    如果您查看您的数据库,您会看到一组键+值。在 Java 中,它转换为 Map 而不是 List

    如果您只对值感兴趣,则需要在代码中处理从 MapList 的转换:

    public void onDataChange(DataSnapshot dataSnapshot) {
        GenericTypeIndicator<Map<String, Friends>> t = new GenericTypeIndicator<Map<String, Friends>>() {};
        Map<String, Friends> map = dataSnapshot.getValue(t);
    
        // get the values from map.values();
    

    或者更简单:

    public void onDataChange(DataSnapshot dataSnapshot) {
        List<Friends> list = new ArrayList<Friends>();
        for (DataSnapshot child: dataSnapshot.getChildren()) {
            list.add(child.getValue(Friends.class));
        }
    }
    

    【讨论】:

    • 代码最后一行说 required: list but found collections
    • 啊……可能是这样。随意编辑。答案的重要一点是snapshot.getValue()Map 而不是List。我添加了一个 sn-p 使这更加简单。
    • 我理解的简化版thanx
    猜你喜欢
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多