2017-06-11 9 views
0

Firebaseから取得した複数行のデータをファイルに書き込もうとしましたが、失敗しました。 this exampleを使用してPrintWriterを作成した後、ループを使用してFirebaseデータベース内の複数の子から値を収集しました。ファイル名の拡張子は.csvです。 LOG文からFirebaseベースのJavaで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(); 

、私はonDataChanged()の値から作成した文字列が正しいことを確認することができます。私の唯一の問題は、ループからファイルに書き込まれないことです。 CSVファイルがアップロードされると、ファイル内の唯一のテキストは列とその下の空白スペースです。

なぜ行が追加されないのですか?

答えて

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を終了する必要があります。

+0

私はとても腹立たしいので、私はこれを完全に逃しました。トンネルのビジョン私は推測する。本当にありがとう!もし私ができるなら、私は百万回upvoteしたいと思います。 – wasimsandhu

+0

@Taras:あなたの説明は正しいですが、答えのコードはリスナーを取り付けた後でもライターを閉じます。 'pw.close()' *を* onDataChange()に移動することを意味しましたか? –

+0

@FrankvanPuffelen私はちょうどエラーを含む著者のコードの唯一の部分を取って、何が間違っているのかを説明しました –

関連する問題