Java 使用'从Firebase下载列表;gdx fireapp';返回具有空字段的对象列表

Java 使用'从Firebase下载列表;gdx fireapp';返回具有空字段的对象列表,java,firebase,firebase-realtime-database,libgdx,Java,Firebase,Firebase Realtime Database,Libgdx,我正在尝试使用library在应用程序中处理Firebase 我遵循了从中给出的示例。 我对“加载列表”示例有问题: 我创建了POJO“user”类并成功地在数据库中编写了一个用户…所以数据库包含一个1个用户的列表,所有字段都已填充(在数据库控制台中验证) 现在,当我尝试下载具有确切给定代码的用户列表时,我得到一个包含1个用户的列表(OK),所有字段都为空 下面是“用户”POJO类 public class UserPOJO{ public String username; public

我正在尝试使用library在应用程序中处理Firebase

我遵循了从中给出的示例。 我对“加载列表”示例有问题:

我创建了POJO“user”类并成功地在数据库中编写了一个用户…所以数据库包含一个1个用户的列表,所有字段都已填充(在数据库控制台中验证)

现在,当我尝试下载具有确切给定代码的用户列表时,我得到一个包含1个用户的列表(OK),所有字段都为空

下面是“用户”POJO类

public class UserPOJO{
  public String username;
  public String email;
  public UserPOJO(){}
  public UserPOJO(String username, String email){
    this.username = username;
    this.email = email;
  }
}
下面是检索用户列表的代码:

public static void readUsersJava (){
    GdxFIRDatabase.instance().inReference("users")
            .filter(FilterType.LIMIT_FIRST, 5)
            .readValue(List.class, new DataCallback<List<UserPOJO>>(){
                @MapConversion(UserPOJO.class)
                @Override
                public void onData(List<UserPOJO> list) {
                    Gdx.app.log("Firebase Java", "read users OK");
                }
                @Override
                public void onError(Exception e) {
                    Gdx.app.log("Firebase Java", "read users KO");
                }
            });
}
publicstaticvoid readUsersJava(){
引用(“用户”)中的gdxFirdDatabase.instance()
.filter(FilterType.LIMIT_FIRST,5)
.readValue(List.class,new DataCallback(){
@映射转换(UserPOJO.class)
@凌驾
公共无效onData(列表){
log(“Firebase Java”,“读取用户OK”);
}
@凌驾
公共无效申报人(例外e){
log(“Firebase Java”,“读取用户KO”);
}
});
}
由于我知道用户的Id,我可以尝试使用

    GdxFIRDatabase.instance().inReference("users/Xc4x0IOm...")
            .readValue(UserPOJO.class, new DataCallback<UserPOJO>() {...}
参考(“用户/Xc4x0IOm…”)中的GDXFirdDatabase.instance() .readValue(UserPOJO.class,新的DataCallback(){…} 但是这样做,我得到了“java.lang.ClassCastException:java.util.HashMap不能强制转换为UserPOJO”。
这可能就是字段为空的原因:无法强制转换…但我找不到如何消除此错误

谁能帮帮我吗?

好的,我找到了这个: 查询答案是一个
Hashmap

所以我不得不:

  • 添加一个使用第一级hashmap的“orderby”子句->我不知道为什么
    对于列表查询,这似乎是必需的
  • 创建我的“用户”类的自定义映射
  • 因此,代码如下所示:(对“user”类没有更改)

    publicstaticvoid readUsersJava(){
    setUsersMapConverter()
    引用(“用户”)中的gdxFirdDatabase.instance()
    .orderBy(OrderByMode.ORDER\u BY\u键,空)
    .filter(FilterType.LIMIT_FIRST,5)
    .readValue(List.class,new DataCallback(){
    ...
    });
    }
    

    fun setUsersMapConverter(){
    GdxFIRDatabase.instance().setMapConverter(对象:FirebaseMapConverter{
    覆盖有趣的转换(映射:可变映射,wantedType:Class):T{
    val元素=(map.get(map.keys.first())作为HashMap
    将UserPOJO(element.get(“displayName”)、element.get(“email”)返回为T
    }
    //应为转换反转(仅GWT平台需要)
    override fun unsert(`object`:Any):映射{
    返回空
    }
    })
    }
    
    希望这能有所帮助


    如果你能找到更好的解决方案,请告诉我。

    这就是我迄今为止所发现的

    public void getUserInfo() {
        GdxFIRDatabase.instance().inReference("users")
                .readValue(List.class, new DataCallback <List<UserInfo>>() {
                    @MapConversion(UserInfo.class)
                    @Override
                    public void onData( List<UserInfo> userInfo) {
                        System.out.println(userInfo.size());
                    }
    
                    @Override
                    public void onError(Exception e) {
    
                    }
                });
    
    }

    我发现,为了从数据库中读取列表中的用户,必须以增量方式保存用户。如果增量跳转超过2,则无法工作

    users - 1 - x - "x"
              - y - "y"
          - 2 - x - "xx"
              - y - "yy" 
          - 3 - ...
    
    希望这对现在有所帮助。我正在试图找出如何将增量值更改为用户的uid,并读取列表中的用户,但这对我还不起作用。我希望有人能帮我解决这个问题

    如果用户像这样保存在数据库中

    users - uid1 - x - "x"
                 - y - "y"
          - uid2 - x - "xx"
                 - y - "yy" 
          - uid3 - ...
    
    我无法使用上面相同的代码读取列表中的用户,但我可以使用下面的代码读取每个用户

    public void getUserInfo(GdxFirebaseUser user) {
        GdxFIRDatabase.instance().inReference("users/" +  )
                .readValue(List.class, new DataCallback <List<UserInfo>>() {
                    @MapConversion(UserInfo.class)
                    @Override
                    public void onData( List<UserInfo> userInfo) {
                        System.out.println(userInfo.size());
                    }
    
                    @Override
                    public void onError(Exception e) {
    
                    }
                });
    
    public void getUserInfo(GdxFirebaseUser){
    GdxFIRDatabase.instance().inReference(“users/”+)
    .readValue(List.class,新数据回调(){
    @映射转换(UserInfo.class)
    @凌驾
    公共无效onData(列出用户信息){
    System.out.println(userInfo.size());
    }
    @凌驾
    公共无效申报人(例外e){
    }
    });
    
    更新:奥德比,上面说的对我有用。谢谢

    users - 1 - x - "x"
              - y - "y"
          - 2 - x - "xx"
              - y - "yy" 
          - 3 - ...
    
    users - uid1 - x - "x"
                 - y - "y"
          - uid2 - x - "xx"
                 - y - "yy" 
          - uid3 - ...
    
    public void getUserInfo(GdxFirebaseUser user) {
        GdxFIRDatabase.instance().inReference("users/" +  )
                .readValue(List.class, new DataCallback <List<UserInfo>>() {
                    @MapConversion(UserInfo.class)
                    @Override
                    public void onData( List<UserInfo> userInfo) {
                        System.out.println(userInfo.size());
                    }
    
                    @Override
                    public void onError(Exception e) {
    
                    }
                });