在我的应用程序的这一部分,我有一个数据库,它吸收我的光传感器的数据。它有一个与每行相关联的RowID。
在后台我有一个AsyncTaskRunner,它读取该表并将每一行写入CSV文件。它应该在数据写入时循环遍历整个表,查找当前TID中尚未复制到CSV的所有行。然后它应该将行值写入CSV并返回并将该行标记为已复制。
第一个循环应该出现在没有返回数据库游标并查找尚未复制到CSV文件的下一行的情况下。每次复制到CSV后,它应评估该CSV文件的大小,以确保它不满。如果不是Full,则应返回Database游标并查找要写入CSV文件的下一行。如果isfull那么它应该循环回到LoopMain并重新开始创建一个要写入的新CSV文件。
虽然完整方法尚未完成,但我处于行数据被写入CSV文件的部分。目前,它没有写入它。在我把这个方法变成For循环之前,它确实做到了,现在却没有。我无法弄清楚发生了什么变化。我已经插入了所有这些日志注释以跟随方法,因为它传递值,接收值然后执行操作以查看它失败的位置。该方法传递了写入CSV文件的部分并继续,但该文件为空。
public void lightloop(){
//Loop Main
int loopcounter;
LoopMain: for(loopcounter = 0; loopcounter < 4; loopcounter++ ){
Log.d(CSV, "lightloop loopcounter = " + loopcounter);
String CSVFinalFileName=createlightcsv();
Log.w(CSV, "LightLoop, CSVFinalFileName = " + CSVFinalFileName);
//Loop 2
Loop2: for(int useless=1; useless > 0; useless++ ){
String flightRowId = evaluateLightTable(filenamePrefix); //returns the rowid of the first line not transmitted
Log.w(CSV, "LightLoop, flightRowId = " + flightRowId);
Log.d(CSV, "filefullBoolean " + useless);
if(flightRowId != null){
Log.w(CSV, "LightLoop flightRowId is NOT NULL");
//write row to csv
//Get all row values and put into a string
String lightRowValues=fetchLightRowData(flightRowId, filenamePrefix);
Log.w(CSV, "lightLoop, lightRowValues are " + lightRowValues);
//Append that data to the CSV file
Log.w(CSV, "Opening File Output Stream");
try {
FileOutputStream csvfos = mContext.openFileOutput(CSVFinalFileName, Context.MODE_PRIVATE);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
OutputStreamWriter sensorCSVWriter = new OutputStreamWriter(csvfos);
try {
sensorCSVWriter.append("LIGHT " + lightRowValues);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/** try {
sensorCSVWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} **/
//mark row as transmitted
SQLDatabase updatelightrow = new SQLDatabase(mContext);
updatelightrow.open();
SQLDatabase.updateLightRow(flightRowId);
updatelightrow.close();
}// end If rowid is not null
//evaluate size of csv
Boolean filefull = CsvStreamer.checkFileSize(CSVFinalFileName);
if(!filefull){
//return to cursor
Log.d(CSV, "lightloop, File is NOT full");
break Loop2;
}else{
Log.d(CSV, "lightloop, File IS full");
//file is full. close it,
//transmit it,
//open a new one
//goto CSV table and mark it transmitted
break LoopMain;
}
}//end Loop2
}//end LoopMain
}
任何人都可以看到为什么没有写入文件?
答案 0 :(得分:0)
csvfos不在同一范围内。我假设该类还有一个名为csvfos的属性,因此该方法正在访问该属性,而不是在try catch中创建的csvfos变量。
尝试更改
try
{
FileOutputStream csvfos = mContext.openFileOutput(CSVFinalFileName, Context.MODE_PRIVATE);
}
catch (FileNotFoundException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
到
FileOutputStream csvfos = null;
try
{
csvfos = mContext.openFileOutput(CSVFinalFileName, Context.MODE_PRIVATE);
}
catch (FileNotFoundException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}