Java 从Firebase读取数据并将其保存在数组列表中

Java 从Firebase读取数据并将其保存在数组列表中,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,当我尝试从数据库中检索数据并将其保存到数组列表中时,我得到以下错误:com.google.firebase.database.DatabaseException:反序列化时需要列表,但得到了类java.util.HashMap @Override public List<Player> getPlayers(String gameId) { final List<Player> commentKeys = new ArrayList<>

当我尝试从数据库中检索数据并将其保存到数组列表中时,我得到以下错误:
com.google.firebase.database.DatabaseException:反序列化时需要列表,但得到了类java.util.HashMap

@Override
    public List<Player> getPlayers(String gameId) {
        final List<Player> commentKeys = new ArrayList<>();
        DatabaseReference nishi = FirebaseDatabase.getInstance().getReference("players");
        Query query = nishi.orderByChild("game_id").equalTo(gameId);
        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                for (DataSnapshot childSnapshot : snapshot.getChildren()) {
                    commentKeys.add((Player) childSnapshot.getValue());
                }
                Log.d("Data:", commentKeys.toString());

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        return commentKeys;
    }

我做错了什么?

这意味着
childSnapshot.getValue()
不会返回
Player
类的对象,即使您将其强制转换为
Player
。由于Firebase数据库的结构是键和值对,这意味着Firebase数据库的每个节点都是一个
映射
,因此在该特定位置上,您不会得到
Player
类的对象,而是得到一个
java.util.HashMap
。看起来您只是在JSON树中读取错误级别的数据。解决方案是将侦听器附加到树中的正确级别,该级别应该与
播放器
类完全相同


别忘了添加
List commentKeys=new ArrayList()的degrationonDataChange()
方法中使用code>,否则它将始终为空。

这意味着
childSnapshot.getValue()
不会返回
Player
类的对象,即使您将其强制转换为
Player
。由于Firebase数据库的结构是键和值对,这意味着Firebase数据库的每个节点都是一个
映射
,因此在该特定位置上,您不会得到
Player
类的对象,而是得到一个
java.util.HashMap
。看起来您只是在JSON树中读取错误级别的数据。解决方案是将侦听器附加到树中的正确级别,该级别应该与
播放器
类完全相同


别忘了添加
List commentKeys=new ArrayList()的degration
onDataChange()
方法中,否则它将始终为空。

尝试澄清获取childSnapshot.getValue的数据类型:

 for (DataSnapshot childSnapshot : snapshot.getChildren()) {
     commentKeys.add((Player) childSnapshot.getValue());
 }
如果它得到HashMap,那么您应该更改:

final List<Player> commentKeys = new ArrayList<>();
final List commentKeys=new ArrayList();

我希望这会有所帮助。

尝试澄清什么样的数据会获取您的childSnapshot.getValue:

 for (DataSnapshot childSnapshot : snapshot.getChildren()) {
     commentKeys.add((Player) childSnapshot.getValue());
 }
如果它得到HashMap,那么您应该更改:

final List<Player> commentKeys = new ArrayList<>();
final List commentKeys=new ArrayList();

我希望这会有所帮助。

谢谢您的澄清!我的回答对你有帮助吗?我会试试看的。谢谢你的澄清!我的回答对你有帮助吗?我会试试看的。