为了账号安全,请及时绑定邮箱和手机立即绑定

使用“gdx-fireapp”从 Firebase 下载列表返回带有空字段的对象列表

使用“gdx-fireapp”从 Firebase 下载列表返回带有空字段的对象列表

慕工程0101907 2021-08-25 17:17:19
我正在尝试使用gdx-fireapp库在LibGdx应用程序中处理 Firebase 。我遵循了这里给出的例子。我有“下载列表”示例的问题:我创建了 POJO“用户”类并成功地在数据库中写入了一个用户......所以数据库包含一个包含 1 个用户的列表,其中填写了所有字段(在数据库控制台中验证)。现在,当我尝试下载具有确切给定代码的用户列表时,我得到一个包含 1 个用户的列表(OK),所有字段均为 NULL这是“用户”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");                }            });}因为我知道用户的 ID,所以我可以尝试从数据库中读取    GdxFIRDatabase.instance().inReference("users/Xc4x0IOm...")            .readValue(UserPOJO.class, new DataCallback<UserPOJO>() {...}但是这样做,我得到“java.lang.ClassCastException:java.util.HashMap 无法转换为 UserPOJO”。这可能是字段为空的原因:无法投射...但我找不到如何摆脱这个错误有人可以帮我吗?
查看完整描述

2 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

好的,我发现了这个:查询答案是 Hashmap<String, Hashmap<String, String>>


所以我不得不:


添加一个“order by”子句 -> 使用第一级哈希图(我不知道为什么)

,这似乎是列表查询所必需的

创建我的“用户”类的自定义映射

所以代码看起来像这样:(“用户”类没有变化)


public static void readUsersJava (){

setUsersMapConverter()

GdxFIRDatabase.instance().inReference("users")

        .orderBy(OrderByMode.ORDER_BY_KEY, null)

        .filter(FilterType.LIMIT_FIRST, 5)

        .readValue(List.class, new DataCallback<List<UserPOJO>>(){

        ...

        });

}


fun setUsersMapConverter(){

    GdxFIRDatabase.instance().setMapConverter(object : FirebaseMapConverter {

        override fun <T : Any?> convert(map: MutableMap<String, Any>, wantedType: Class<T>): T {

            val element = (map.get(map.keys.first())) as HashMap<String, String>

            return UserPOJO(element.get("displayName"), element.get("email")) as T

        }

        // Should be inversion of convert (needed only by GWT platform)

        override fun unConvert(`object`: Any): Map<String, Any>? {

            return null

        }

    })

}

希望能有所帮助。


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


查看完整回答
反对 回复 2021-08-25
  • 2 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信