5

私のsqliteデータベースからデータを取得してcsvファイルに書き込み、書き込みが完了したら情報を電子メールで送信しようとしています。データベースには3列のテーブルが1つしかありません。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データベースデータを取得し、コードに示されているようにファイルに書き込むことができないことです。

4

1 に答える 1

10

このルーチンを使用して、SQLite データベースを SD カード上のファイルに CSV 形式でダンプします。

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 テーブルの行として書き込まれます。

于 2013-01-24T20:41:04.960 に答える