使用 'gdx-fireapp' 从 Firebase 下载列表会返回包含空字段的对象列表



我正在尝试使用 gdx-fireapp 库在 LibGdx 应用程序中处理 Firebase。

我从这里开始遵循给定的示例。 我在"下载列表"示例时遇到问题:

我创建了 POJO"user"类并在数据库中成功编写了一个用户......因此,数据库包含 1 个用户的列表,其中填写了所有字段(在数据库控制台中验证(。

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

这是"用户"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"。
这可能就是为什么字段为空的原因:无法投射...但是我找不到如何摆脱此错误

有人可以帮我吗?

这就是我到目前为止所发现的。

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) {
}
});

公共类用户信息 {

String x, y;
public UserInfo(){}
public UserInfo (String x, String y){
this.x= x;
this.y= y;
}

}

我发现为了让它从列表中的数据库中读取用户,必须以增量方式保存用户。 如果增量跳跃超过 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) {
}
});

更新:上面说的奥德比,空对我有用。谢谢

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

所以我不得不:

  1. 添加一个"order by"子句 -> 消耗第一级哈希映射(我不知道为什么(
    这似乎是列表查询所必需的
  2. 创建我的"用户"类的自定义映射

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

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
}
})
}

希望能有所帮助。

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