java - 将 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
解决方案
我终于设法解决了这个问题!解决方法如下:
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 中来做到这一点。
推荐阅读
- facebook - 通过 API 在 Facebook 上分享帖子后的 Facebook 分享响应
- php - Call for undefined function in Wordpress plugin
- android - 在选项卡布局片段中未在 androidX 中显示其布局
- apache-spark - java.lang.UnsatisfiedLinkError: jep.Jep.init(Ljava/lang/ClassLoader;ZZ) on google cloud dataproc
- javascript - How to create singleton classes in Javascript?
- file - 从 Google Cloud Compute 上的 Windows Server 映射 Windows 上的共享文件夹
- flutter - 使用颤振块架构的下拉按钮示例
- c# - 如果正在运行,请取消异步任务并再次运行它(刷新行为)
- javascript - 如何使用带有 fetch 功能的 promise 访问数据库?
- performance - JMeter 不执行我的测试计划的所有请求