Android Studio / Firebase:尝试检索所有数据,但仅获取最后一项

时间:2018-08-12 04:07:18

标签: android firebase firebase-realtime-database

我正在尝试制作一个在地图上显示用户添加的工作的应用。为此,我尝试创建一个实时Firebase数据库来存储所有作业:

Image of Firebase Database Json Tree

在onCreate方法中,将从Firebase数据库中所有当前作业的列表中添加标记(作业)。

到目前为止,这是我的代码:

        DatabaseReference ref1 = database.getReference();
        DatabaseReference jobsReference = ref1.child("Jobs");

        jobsReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                jobs = new ArrayList<>();
                // AddJobHandler is the object I use to store the jobs
                for(DataSnapshot jobSnapShot : dataSnapshot.getChildren()) {
                    AddJobHandler newJob = jobSnapShot.getValue(AddJobHandler.class);
                    jobs.add(newJob);
                }

                for(int i = 0; i < jobs.size(); i++) {
                    Toast.makeText(map.this, jobs.get(i).getDesc(), Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

运行该应用程序时,我会得到3次敬酒,但添加的是最近工作的标题。如何将所有作业从数据库添加到作业ArrayList中?

TL; DR:作业ArrayList似乎只添加了最新的作业。如何获取 ArrayList 以添加Firebase Realtime数据库中的所有作业

2 个答案:

答案 0 :(得分:0)

每次在dataSnapshot中获得事件时,都会创建一个新的ArrayList,因此只有最后一个。尝试在类的构造函数中或其他地方执行jobs = new ArrayList<>();。它必须被发射一次。 同样,在执行某些操作之前先检查if (dataSnapshot.exist)

答案 1 :(得分:0)

似乎您的代码中只需要进行一项更改,请选中此项

jobs = new ArrayList<>(); //write this in onCreate(); or while declaration in global scope. 

您的下方代码

            DatabaseReference ref1 = database.getReference();
            DatabaseReference jobsReference = ref1.child("Jobs");

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

                    // AddJobHandler is the object I use to store the jobs
                    for(DataSnapshot jobSnapShot : dataSnapshot.getChildren()) {
                        AddJobHandler newJob = jobSnapShot.getValue(AddJobHandler.class);
                        jobs.add(newJob);
                    }

                    for(int i = 0; i < jobs.size(); i++) {
                        Toast.makeText(map.this, jobs.get(i).getDesc(), Toast.LENGTH_SHORT).show();
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });