【问题标题】:Android Studio/Firebase: Trying to retrieve all data but only getting the last itemAndroid Studio/Firebase:尝试检索所有数据但只获取最后一项
【发布时间】:2018-08-12 04:07:18
【问题描述】:

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

在 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 实时数据库中的所有作业

【问题讨论】:

  • 我认为烘烤不同的值没有任何问题。尝试通过调试器添加断点,以便检查哪里出错
  • @Killer 我使用调试器和断点来检查 ArrayList,一切似乎都运行良好。你确定我的代码没问题?
  • 您在onDataChange 的末尾缺少类似adapter.notifyDataSetChanged() 的内容。否则,您的适配器将不会知道数据已更改,视图也不会更新。
  • @FrankvanPuffelen 你是什么意思。我应该在哪里声明适配器?
  • 嗯...也许我误解了这个问题。如果您的代码显示 3 个 toast 用于 3 个项目,那听起来很棒。什么代码不起作用?

标签: android firebase firebase-realtime-database


【解决方案1】:

您的代码似乎只需要更改一项,请检查一下,

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

                }
            });

【讨论】:

    【解决方案2】:

    每次您在 dataSnapshot 中获得一个事件时,您都会创建新的 ArrayList,因此您只是最后一个。尝试在类的构造函数或其他地方做jobs = new ArrayList&lt;&gt;();。它必须被解雇一次。 在对它进行一些操作之前检查if (dataSnapshot.exist) 也很好。

    【讨论】:

    • 我正在尝试创建一个 ArrayList,其中包含数据库中的所有作业。您的解决方案给出了一个空列表。
    • 这是因为您在函数onDataChange 中创建了jobs = new ArrayList&lt;&gt;();。尝试在类的构造函数中执行此操作。并带回您的 foreach,因为我可以选择查询子值。
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多