我一直在尝试(不成功)将从Firebase检索到的多行数据写入文件,然后我将其上传到存储。我使用this example创建了一个PrintWriter,然后使用循环从我的Firebase数据库中的多个子项中收集值。文件名的扩展名为.csv。
public PrintWriter pw;
...
File file = new File(this.getFilesDir(), filename);
pw = new PrintWriter(new BufferedWriter(new FileWriter(file, true)));
String columns = <COLUMNS>;
pw.write(columns);
patientRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot postSnapshot: snapshot.getChildren()) {
Object object = postSnapshot.getValue(Object.class);
String value1 = object.getValue1();
...
String row = value1 + ", " + value2 + ", "...;
pw.println(row);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
pw.close();
从Log语句中,我可以看到我根据onDataChanged()
中的值创建的字符串是正确的。我唯一的问题是它不会从循环中写入文件。上载CSV文件时,文件中唯一的文本是列,下面还有一个空白区域。
为什么没有追加行?
答案 0 :(得分:1)
String columns = <COLUMNS>;
pw.write(columns);
patientRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot postSnapshot: snapshot.getChildren()) {
Object object = postSnapshot.getValue(Object.class);
String value1 = object.getValue1();
...
String row = value1 + ", " + value2 + ", "...;
pw.println(row);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
pw.close();
您已向patientRef添加了一些事件侦听器,但这并不意味着onDataChange(...)已立即执行,它仅作为侦听器注册。添加它之后,关闭PrintWriter,因此除了列之外不会写任何内容,因为当执行SingleValueEvent时pw已经关闭。您需要在实际执行事件后或在其中关闭pw。