当前位置: 首页 > 知识库问答 >
问题:

有没有办法只在我从Android中的Firebase获得数据后再进行?

方飞翼
2023-03-14

我正在为一家酒店开发一个应用程序,使酒店管理层能够报告和查看关注和问题。我正在使用Android和Firebase为这个应用程序。

为了最小化数据下载并优化速度,我正在数据库中添加“活动”和“已解析”节点,如下所示:

现在,酒店希望我添加一个函数来创建一个Excel报告,报告过去一个月内关闭/解决的问题。为此,我将在“resolved”节点上附加一个单值事件侦听器,获取已解决关注点的键,然后为每个键从“allconcerners”节点获取数据,将每个节点的数据存储到String的ArrayList中。之后,我将使用这个JSON to Excel API for Android创建Excel文件。

我可以使用以下代码访问已解决的关注点的密钥:

DatabaseReference resolvedReference = FirebaseDatabase.getInstance().getReference()
            .child(getApplicationContext().getResources().getString(R.string.concerns))
            .child(getApplicationContext().getResources().getString(R.string.resolved));

    final ArrayList<String> keys = new ArrayList<>();

    resolvedReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {

            //Getting keys of all resolved concerns in keys arraylist here
            for (DataSnapshot ds : snapshot.getChildren()){
                keys.add(ds.getValue(String.class));
            }

            //Storing JSON data in this arraylist
            final ArrayList<String> data = new ArrayList<>();

            for(int i = 0; i<keys.size() ; ++i){
                String key = keys.get(i);

            //Getting data of each concern here  
            FirebaseDatabase.getInstance().getReference().child(getApplicationContext().getResources().getString(R.string.allConcerns))
                        .child(key).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        String type = snapshot.child("type").getValue().toString();
                        Log.i("Type", type);
                        if(type.equals("0")) {
                            SafetyConcernClass s = snapshot.getValue(SafetyConcernClass.class);
                            Log.i("Snapshot of key", s.toString());
                            data.add(s.toString());
                        }
                        else{
                            GembaWalkClass g = snapshot.getValue(GembaWalkClass.class);
                            Log.i("Snapshot of key", g.toString());
                            data.add(g.toString());
                        }
                        Proof proof = snapshot.child("proof").getValue(Proof.class);
                        Log.i("Proof", proof.toString());
                    }

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

                    }
                });
            }

            //Issue I am facing is here
            Log.i("Data size", String.valueOf(data.size()));

        }

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

        }
    });

}

这里的真正问题是在记录data.size()时。由于Firebase是异步的,因此FOR循环在数据被提取并输入到data ArrayList之前就结束了,因此它给我的大小为0。由于没有数据被提取,我无法创建一个Excel文件。

我的问题是,如何确保只有在各自已解决的关注点的数据存储在ArrayList中之后才继续日志data.size()?

共有2个答案

裴心思
2023-03-14

典型的方法是保留一个计数器或一个倒计时锁存器来跟踪您已经下载了多少关注快照。当计数器到达keys.size()时,您就知道完成了。

另请参见在Firebase侦听器中设置Singleton属性值

邵兴庆
2023-03-14

你应该写你的方法

AddListenerforSingleValueEvent

使用AsyncTask或Kotlin coroutines

 类似资料:
  • 因为我是在中配置序列化程序的,所以我不能在构造函数参数中传递。

  • 我正在开发一个反应原生应用程序并使用Firebase fiRecovery作为集中式数据库。在将用户数据放在firest之前,我正在使用crypto js加密数据。现在我想在数据库中搜索,问题是数据已加密,当我再次尝试加密相同的数据时,crypto js会创建不同的加密数据。有没有可能在Firebase中搜索加密数据,而无需在移动应用程序中加载数据然后解密它?

  • 问题内容: 我试图找到一种方法来查找数据库中的表的名称(如果存在)。我发现从sqlite cli我可以使用: 然后对于字段: 这显然在python中不起作用。有没有办法用python做到这一点,还是我应该只使用sqlite命令行? 问题答案: 您应该能够从表中访问表名称。 列名不能直接访问。获取它们的最简单方法是查询表并从查询结果中获取列名。

  • 有什么方法可以获得它吗?因为我需要在应用程序内的对话框窗口中显示它。推送通知不仅仅是文本和标题,它对用户来说不仅仅是信息,它还会起到一定的作用。 在中接收通知标题、正文和有效负载: 正在从内部的附加程序捕获有效负载

  • 我的数据结构是这样的,我想做的是从不同的节点获得价值。 现在,我想在添加人的孩子时获取位置的值(之前保存的LatLng)。但我知道的是要获得附加值。是否有方法引用不同的节点值? 另外,您能告诉我如何从数据库中获取LatLng并将其分配给LatLng吗?

  • 在pygame中,是否有任何方法可以在面具内将某些东西blit到屏幕上。例如:如果你有一个遮罩,除了左上角和全黑图像外,所有的位都被设置为1,而不改变图像,你能保持左上角(和遮罩一样)清晰吗?只有更新一个掩码(而不是一个rect)才有助于提高效率。