Как я могу использовать DataSnapshot для создания ArrayList всех данных, которые у меня есть в Firebase? - PullRequest
0 голосов
/ 20 апреля 2019

Моя проблема в том, что у меня есть база данных в Firebase, где я храню объекты "День", и я хочу получить все содержимое базы данных и поместить все в ArrayList дней, НО, когда я выполняю код, чтобы сделать это, у меня появляется ошибка: «Не удается преобразовать объект типа java.lang.String в тип com .example.android_project_test.Day ", и я понятия не имею, как ее решить.

Я пытался разыграть его, но это не сработало.

Сообщение:

2019-04-20 17:52:18.158 12477-12477/com.example.android_project_test E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.android_project_test, PID: 12477
    com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.android_project_test.Day
        at com.google.android.gms.internal.firebase_database.zzkt.zzb(Unknown Source:209)
        at com.google.android.gms.internal.firebase_database.zzkt.zza(Unknown Source:0)
        at com.google.firebase.database.DataSnapshot.getValue(Unknown Source:10)
        at com.example.android_project_test.CalendarDbHelper.fetchData(CalendarDbHelper.java:125)
        at com.example.android_project_test.CalendarDbHelper.access$000(CalendarDbHelper.java:12)
        at com.example.android_project_test.CalendarDbHelper$1.onChildAdded(CalendarDbHelper.java:58)
        at com.google.android.gms.internal.firebase_database.zzbt.zza(Unknown Source:71)
        at com.google.android.gms.internal.firebase_database.zzgx.zzdr(Unknown Source:2)
        at com.google.android.gms.internal.firebase_database.zzhd.run(Unknown Source:71)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Вот мой дневной класс:

public class Day {

    private String id;
    private String dayName;
    private String dayDate;
    private ArrayList<Meal> meals;

    Day(){}

    Day(String id, String dayName, String dayDate, ArrayList<Meal> meals) {
        this.id = id;
        this.dayName = dayName;
        this.dayDate = dayDate;
        this.meals = meals;

    }

    Day(String dayName, String dayDate, ArrayList<Meal> meals) {
        this.dayName = dayName;
        this.dayDate = dayDate;
        this.meals = meals;

    }

    Day(String dayName, String dayDate) {
        this.dayName = dayName;
        this.dayDate = dayDate;

    }

Вот как я добавляю Days в базу данных:

public void addDay(Day day)
    {
                String Id = db.push().getKey();
                day.setId(Id);
                db.child(Id).setValue(day); 
   }

Вот метод, который я использую для получения ArrayList из базы данных:

public ArrayList<Day> listDays()
    {


        db.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                fetchData(dataSnapshot);
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                fetchData(dataSnapshot);

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        return listDays;
    }

Вот fetchData (dataSnapshot), где у меня проблема:

private void fetchData(DataSnapshot dataSnapshot)
    {
        for(DataSnapshot postSnapShot:dataSnapshot.getChildren())
        {
            Day day= postSnapShot.getValue(Day.class);
            listDays.add(day);

        }
    }

Когда я хочу сделать «Day day = postSnapShot.getValue (Day.class);», я хочу получить каждого ребенка как объект Day. Но то, что я получаю, это сообщение, которое я написал выше.

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

вы установили childEventListener.это не то же самое, что valueEventListener.Вы получаете данные ребенок за ребенком.

смотрите здесь

0 голосов
/ 20 апреля 2019

Измените свои fetchData (dataSnapshot), как указано ниже

private void fetchData(DataSnapshot dataSnapshot)
{
        Day day= dataSnapshot.getValue(Day.class);
        listDays.add(day);
}

В вашем коде метод fetchData () перебирает дочерние объекты одного объекта, который будет возвращать строковые значения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...