【问题标题】:Writing multiple lines to CSV file in Java with Firebase使用 Firebase 在 Java 中将多行写入 CSV 文件
【发布时间】:2017-06-11 00:06:00
【问题描述】:

我一直在尝试(未成功)将从 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 文件时,文件中的唯一文本是列,加上下方的空格。

为什么没有追加行?

【问题讨论】:

    标签: java android csv firebase firebase-realtime-database


    【解决方案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。

    【讨论】:

    • 我很生气,我完全错过了这个。我猜是隧道视觉。非常感谢!如果可以的话,我会投票一百万次。
    • @Taras:您的描述是正确的,但是您的答案中的代码在附加监听器后仍然关闭了作者。你的意思是将pw.close() 移入 onDataChange()
    • @FrankvanPuffelen 我只取了作者代码中唯一包含错误的部分并描述了那里出了什么问题
    猜你喜欢
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 2013-10-29
    • 1970-01-01
    • 2014-08-20
    • 2022-10-20
    相关资源
    最近更新 更多