首页 > 解决方案 > 如何使用 DataSnapshot 为 Firebase 中的所有数据创建一个 ArrayList?

问题描述

我的问题是我在 Firebase 中有一个存储“Day”对象的数据库,我想检索数据库的所有内容并将所有内容放入 Days 的 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 对象。但我得到的是我上面写的信息。

标签: androidfirebasearraylistfirebase-realtime-databasetypes

解决方案


你已经设置了一个 childEventListener。与 valueEventListener 不同。你得到一个孩子一个孩子的数据。

看这里


推荐阅读