Android / Firebase — не удается преобразовать объект типа java.util.ArrayList в тип ** мой объект**

#android #firebase #firebase-realtime-database

#Android #firebase #firebase-realtime-database

Вопрос:

Я пытаюсь получить значения каждого узла в разделе «шаблоны».

введите описание изображения здесь

Например, «eght» (просто случайное имя теста) содержит ArrayList из ArrayLists . Итак, ArrayList< .ArrayList>.

Мне просто нужно получить значения один раз, поэтому я использую один прослушиватель событий:

 mTemplateRef.addListenerForSingleValueEvent(
     new ValueEventListener() {
     @Override
     public void onDataChange(DataSnapshot dataSnapshot) {

          for(DataSnapshot templateSnapshot : dataSnapshot.getChildren()){

               // I've tried a million different things here, but all result in the error
              // This is the error line
              MapFoo mapFoo = templateSnapshot.getValue(MapFoo.class);
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Log.w(TAG, "getUser:onCancelled", databaseError.toException());
                    // ...
                }
            });
  

Я всегда заканчиваю этим:

 Can't convert object of type java.util.ArrayList to type com.appname.template_editor.MapFoo
  

Последняя часть — это любой объект, который я пытаюсь.

Вот MapFoo:

Кстати, я использую карту, потому что при отладке узлы кажутся в форме HashMap . Я также пробовал объект HashMap с той же ошибкой. Я также попробовал несколько других объектов, чтобы попытаться заставить его работать, но безуспешно.

 public class MapFoo {
public Map<String, ArrayList> mapList;

public MapFoo(){

}

public Map getMapList(){
    return mapList;
}

public MapFoo(Map<String, ArrayList> mapList){
    this.mapList = mapList;
}
  

}

Другой вариант, который я пробовал:

 public class MasterListTemplateClass {

public String templateName;
public ArrayList<ArrayList> arrayList;

public MasterListTemplateClass() {
}

public MasterListTemplateClass(String templateName, ArrayList<ArrayList> arrayList) {
    this.templateName = templateName;
    this.arrayList = arrayList;
}

public String getName() {
    return templateName;
}

public ArrayList<ArrayList> getList() {
    return arrayList;
}
  

}

Я просто не могу заставить это работать. Мне просто нужны значения в моей базе данных!

Комментарии:

1. Является ArrayList ли аргумент without type вашим собственным классом или просто необработанным типом?

2. Какая строка кода вызывает ошибку?

3. Кроме того, пожалуйста, исправьте отступ, чтобы ваш код было легче читать.

4. 1-й комментарий: Да, это просто обычный тип. 2-й: отредактировал строку, которая вызывает ошибку. Кроме того, что не так с моим отступом?

Ответ №1:

вместо числовых идентификаторов, таких как 0,1,2, дайте им имя, чтобы иметь возможность формировать модель ur, поскольку я не уверен, возможно ли создать модель с числовыми именами.

например, назовите 0,1,2 как дни, заголовок, размер соответственно и создайте следующую модель

 public class MyModel{

    public String days;
    public String title;
    public String dimen;

    public MyModel(){

    }

    public String getDays(){
        return this.days;
    }

    public String getTitle(){
        return this.title;
    }

    public String getDimen(){
        return this.dimen;
    }
}
  

Затем достигните этой модели через 2 цикла, вызвав 2 snapshot.getChildren()

  for(DataSnapshot templateSnapshot : dataSnapshot.getChildren()){
     for(DataSnapshot snap : templateSnapshot.getChildren()){


              MyModel model = snap.getValue(MyModel.class);
                    }
                }
...
  

Комментарии:

1. Хм, я не уверен, почему это числа, именно так это было установлено автоматически. Я постараюсь их изменить.

2. @therealccarter как выглядит ваш класс MapFoo после вашего изменения?

Ответ №2:

Просто вспомнил этот пост. Нашли ответ. При работе с картами в Firebase, если у вас есть int в виде строки (1 против «1»), Firebase считывает это как int . Независимо от того, ввели вы его как строку или нет. Итак, что я сделал, это добавил «_key» к числам («1_key»), что заставило Firebase прочитать его как строку, а не как int. Это исправило ситуацию