首页 > 解决方案 > 将 Firestore 查询的结果保存到 ArrayList 并将每个结果添加到 CSV 文件

问题描述

我想将我的 Firestore 查询文档快照的结果保存到 CSV 文件中,并将每个新结果添加到 CSV 文件的新行中。

我目前正在使用 for 循环来迭代结果并为任务结果中的每个字符串分配一个值,然后将它们添加到 CSV 数据列表中。但是,我的 CSV 文件显示的是最后一个结果的副本,而不是我查询的两个当前结果。

我的代码看起来像这样

query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if(task.isSuccessful()){
                            for (QueryDocumentSnapshot document : task.getResult()){

                                //Log.d("TAG", document.getId() + " => " + document.getData());

                                //CSVWRITER LIBRARY USED TO CREATED CSV FILE
                                try {
                                    CSVWriter writer = new CSVWriter((new FileWriter(csv)));

                                    List<String[]> data = new ArrayList<String[]>();
                                    data.add(new String[]{"Profession", "CPD_Number", "Summary_Text", "Personal_Statement"});
                                    data.add(new String[]{fProfession, fCpd_Number, fSummary_Text, fPersonal_Statement});
                                    data.add(new String[]{"Activity_Name", "Activity_Date", "Activity_Hours", "Activity_Mins", "Activity_Type", "Activity_Description", "Activity_Ref1", "Activity_Ref2", "Activity_Ref3", "Activity_Ref4", "Image_Url"});

                                        for (int i = 0; i < task.getResult().size(); i++) {

                                            fActivity_Name = document.getString("Activity_Name");
                                            fActivity_Date = document.getString("Activity_Date");
                                            fActivity_Hours = document.getString("Activity_Hours");
                                            fActivity_Mins = document.getString("Activity_Mins");
                                            fActivity_Type = document.getString("Activity_Type");
                                            fActivity_Description = document.getString("Activity_Description");
                                            fActivity_Ref1 = document.getString("Activity_Ref1");
                                            fActivity_Ref2 = document.getString("Activity_Ref2");
                                            fActivity_Ref3 = document.getString("Activity_Ref3");
                                            fActivity_Ref4 = document.getString("Activity_Ref4");
                                            fImage_Url = document.getString("Image_URL");

                                            Log.d("TAG", "activity name is: " + fActivity_Name);
                                            data.add(new String[]{fActivity_Name, fActivity_Date, fActivity_Hours, fActivity_Mins, fActivity_Type, fActivity_Description, fActivity_Ref1, fActivity_Ref2, fActivity_Ref3, fActivity_Ref4, fImage_Url});

                                        }

                                    writer.writeAll(data);
                                    writer.close();

                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                        } else {
                            Log.d("TAG", "Error getting documents: " + task.getException());
                        }
                    }
                });

谁能发现这里可能发生了什么?同样根据我的日志,Log.d("TAG", "activity name is: " + fActivity_Name);这条线打印了两次,我也不确定它为什么会这样做。

日志结果:

2020-07-31 15:25:35.201 6741-6741/com.example.cpd D/TAG: activity name is: hoir CHANGE AGAIN NEW
2020-07-31 15:25:35.201 6741-6741/com.example.cpd D/TAG: activity name is: hoir CHANGE AGAIN NEW
2020-07-31 15:25:35.203 6741-6741/com.example.cpd D/TAG: activity name is: other CHANGE
2020-07-31 15:25:35.204 6741-6741/com.example.cpd D/TAG: activity name is: other CHANGE

标签: javafirebasegoogle-cloud-firestore

解决方案


我终于设法解决了这个问题!解决方法如下:

query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<QuerySnapshot> task) {
                            if(task.isSuccessful()){
                                //CSVWRITER LIBRARY USED TO CREATED CSV FILE
                                try {
                                    CSVWriter writer = new CSVWriter((new FileWriter(csv)));

                                    List<String[]> data = new ArrayList<String[]>();
                                    data.add(new String[]{"Profession", "CPD_Number", "Summary_Text", "Personal_Statement"});
                                    data.add(new String[]{fProfession, fCpd_Number, fSummary_Text, fPersonal_Statement});
                                    data.add(new String[]{"Activity_Name", "Activity_Date", "Activity_Hours", "Activity_Mins", "Activity_Type", "Activity_Description", "Activity_Ref1", "Activity_Ref2", "Activity_Ref3", "Activity_Ref4", "Image_Url"});

                                    for (QueryDocumentSnapshot document : task.getResult()){

                                        fActivity_Name = document.getString("Activity_Name");
                                        fActivity_Date = document.getString("Activity_Date");
                                        fActivity_Hours = document.getString("Activity_Hours");
                                        fActivity_Mins = document.getString("Activity_Mins");
                                        fActivity_Type = document.getString("Activity_Type");
                                        fActivity_Description = document.getString("Activity_Description");
                                        fActivity_Ref1 = document.getString("Activity_Ref1");
                                        fActivity_Ref2 = document.getString("Activity_Ref2");
                                        fActivity_Ref3 = document.getString("Activity_Ref3");
                                        fActivity_Ref4 = document.getString("Activity_Ref4");
                                        fImage_Url = document.getString("Image_URL");
                                        //Log.d("TAG", document.getId() + " => " + document.getData());
                                        data.add(new String[]{fActivity_Name, fActivity_Date, fActivity_Hours, fActivity_Mins, fActivity_Type, fActivity_Description, fActivity_Ref1, fActivity_Ref2, fActivity_Ref3, fActivity_Ref4, fImage_Url});
                                    }

                                    writer.writeAll(data);
                                    writer.close();

                                } catch (IOException e) {
                                    e.printStackTrace();
                                }

                            } else {
                                //Log.d("TAG", "Error getting documents: " + task.getException());
                            }
                        }
                    });

通过在编写 CSV 文件时将 QueryDocumentSnapshot 任务结果移动到我的 try/catch 中来做到这一点。


推荐阅读