java.util.HashMap无法强制转换为Object

Qk *_*ita 4 android firebase firebase-realtime-database

这是我的UserModel类

public class UserModel {

private String userName;
private String password;

public UserModel(String userName, String password) {
    this.userName = userName;
    this.password = password;
}

public String getUserName() {
    return userName;
}

public String getPassword() {
    return password;
}
}
Run Code Online (Sandbox Code Playgroud)

这是我从firebase获取数据的方法

userReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            HashMap<String, UserModel> userModelHashMap = (HashMap<String, UserModel>) dataSnapshot.getValue();
            ArrayList<UserModel> userModelList = new ArrayList<>(userModelHashMap.values());
            if (userModelList.size() != 0) {
                Log.d(TAG, "onDataChange: " + userModelList.get(0));
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
Run Code Online (Sandbox Code Playgroud)

它成功登录.

onDataChange:{password = abcde,userName = 1234}

在我想记录更多细节之前,一切似乎都没问题

Log.d(TAG, "onDataChange: " + userModelList.get(0).getUserName());
Run Code Online (Sandbox Code Playgroud)

这是我改变代码后这一行的错误

java.lang.ClassCastException:java.util.HashMap无法强制转换为qklahpita.vn.testfirebasedemo.UserModel

我无法理解为什么getUserName()出错.如果userModelList.get(0)没有返回UserModel,它返回什么?

Sus*_*ger 6

这是因为您获得的数据是"HashMap"而不是"UserModel".您可以这样做来创建对象.

UserModel userModel = dataSnapshot.getValue(UserModel.class);
Run Code Online (Sandbox Code Playgroud)

编辑:如果有多个用户,您还需要循环访问子项.像这样.

for(Datasnapshot userSnapshot : dataSnapsot.getChildren(){
   UserModel userModel = userSnapshot.getValue(UserModel.class);
}
Run Code Online (Sandbox Code Playgroud)