Загрузка списка из Firebase с использованием 'gdx-fireapp' возвращает список объектов с пустыми полями - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь разобраться с Firebase в LibGdx приложении с использованием библиотеки gdx-fireapp .

Я следовал приведенным примерам из здесь . У меня проблемы с образцом "загрузки списка":

Я создал класс пользователя POJO и успешно записал пользователя в базу данных ... поэтому база данных содержит список из 1 пользователя со всеми заполненными полями (проверено в консоли базы данных).

Теперь, когда я пытаюсь загрузить список пользователей с точным заданным кодом, я получаю список с 1 пользователем (ОК), все номера которого равны 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");
                }
            });
}

Поскольку я знаю идентификатор пользователя, я могу попробовать прочитать его из базы данных с

    GdxFIRDatabase.instance().inReference("users/Xc4x0IOm...")
            .readValue(UserPOJO.class, new DataCallback<UserPOJO>() {...}

но, делая это, я получаю "java.lang.ClassCastException: java.util.HashMap не может быть приведен к UserPOJO".
Вероятно, поэтому поля пусты: невозможно привести ... Но я не могу найти способ избавиться от этой ошибки

Может кто-нибудь помочь мне, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Это то, что я понял до сих пор.

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

                }
            });

открытый класс UserInfo {

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

                }
            });

Обновление: oderby, null сказал выше, работал для меня. Спасибо

0 голосов
/ 07 сентября 2018

ОК, я нашел это: ответ на запрос: Hashmap<String, Hashmap<String, String>>

поэтому мне пришлось:

  1. добавить предложение 'order by' ->, которое использует хэш-карту первого уровня (не знаю почему)
    кажется обязательным для списка запросов
  2. создать пользовательское сопоставление моего класса 'user'

поэтому код выглядит так: (без изменений в классе 'user')

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

Надеюсь, что это может помочь.

Дайте мне знать, если вы найдете лучшее решение.

...