将SQLite导出为CSV

5
我正在尝试从我的SQLite数据库中提取数据并将其写入CSV文件,当完成写入时通过电子邮件发送信息。在数据库中我只有一个带有3列的表格。我有一个DBAdapter和一个类,其中包含用户必须按键以能够导出数据的按钮。
这是我尝试过的代码Exportdata.java
try {
    root = Environment.getExternalStorageDirectory();                   
    Log.i(TAG,"path.." +root.getAbsolutePath());  

    //check sdcard permission  
    if (root.canWrite()) {  
        File fileDir = new File(root.getAbsolutePath()+"/fun/");  
        fileDir.mkdirs();  

        //   Log.d("DATABASE", db.getAllBYname());

        File file= new File(fileDir, "itisfun.csv");  
        FileWriter filewriter = new FileWriter(file);  
        BufferedWriter out = new BufferedWriter(filewriter);  
        out.write("I m enjoying......dude..............."  ); 
        out.close();  
    }  
} catch (IOException e) {  
    Log.e("ERROR:---", "Could not write file to SDCard" + e.getMessage());  
} 

这段代码可以在SD卡中创建文件,但问题是我无法将SQLite数据库中的数据作为所示写入文件。我被卡住了,请给我提供一个例子或编辑我的代码以获得正确的解决方案。

1个回答

10

我使用这个例程将一个SQLite数据库以CSV格式转储到SD卡上的文件中:

private Boolean backupDatabaseCSV(String outFileName) {
    MyLog.d(TAG, "backupDatabaseCSV");
    Boolean returnCode = false;
    int i = 0;
    String csvHeader = "";
    String csvValues = "";
    for (i = 0; i < GC.CURCOND_COLUMN_NAMES.length; i++) {
        if (csvHeader.length() > 0) {
            csvHeader += ",";
        }
        csvHeader += "\"" + GC.CURCOND_COLUMN_NAMES[i] + "\"";
    }

    csvHeader += "\n";
    MyLog.d(TAG, "header=" + csvHeader);
    dbAdapter.open();
    try {
        File outFile = new File(outFileName);
        FileWriter fileWriter = new FileWriter(outFile);
        BufferedWriter out = new BufferedWriter(fileWriter);
        Cursor cursor = dbAdapter.getAllRows();
        if (cursor != null) {
            out.write(csvHeader);
            while (cursor.moveToNext()) {
                csvValues = Long.toString(cursor.getLong(0)) + ",";
                csvValues += Double.toString(cursor.getDouble(1))
                        + ",";
                csvValues += Double.toString(cursor.getDouble(2))
                        + ",";
                csvValues += "\"" + cursor.getString(3) + "\",";
                csvValues += Double.toString(cursor.getDouble(4))
                        + ",";
                csvValues += Double.toString(cursor.getDouble(5))
                        + ",";
                csvValues += "\"" + cursor.getString(6) + "\",";
                csvValues += Double.toString(cursor.getDouble(7))
                        + ",";
                csvValues += Double.toString(cursor.getDouble(8))
                        + ",";
                csvValues += Double.toString(cursor.getDouble(9))
                        + "\n";
                out.write(csvValues);
            }
            cursor.close();
        }
        out.close();
        returnCode = true;
    } catch (IOException e) {
        returnCode = false;
        MyLog.d(TAG, "IOException: " + e.getMessage());
    }
    dbAdapter.close();
    return returnCode;
}

GC是我的全局常量类,其中包含表格列名等内容。这些列名用于生成CSV文件的标题行。getAllRows位于数据库适配器中,返回表格中的所有行。while循环将所有返回的行都转储出来。长整型数据用逗号分隔,文本数据则用引号括起来并以逗号分隔。MyLog.d在测试模式下进行日志记录(Log.d),而在生产模式下不执行任何操作。dbAdapter作为全局变量在函数外部定义:

DatabaseAdapter dbAdapter = null;

它在onCreate方法中被初始化为:

dbAdapter = new DatabaseAdapter(getApplicationContext());

在该活动中,dbAdapter被用于多个函数。如果你全局定义了你的数据库适配器,请确保每次使用时都将每个dbAdapter.open()与dbAdapter.close()配对使用。此外,不要忘记关闭你打开的每个游标。

注意:csvValues是每个SQLite行返回的列的串联。对于在SQLite游标中返回的每一行,csvValues都被写入CSV表格中的一行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接