今回はAndroidアプリ上で、sqliteデータベースに登録されたデータをCSV出力する機能について書きます。

完成イメージは以下です。

出力したCSVファイルの中身は以下。

1.CSV出力ボタンにダイアログ機能を実装

csvOutputButtonというIDのボタンをクリック時にconfirmOutput()メソッドを呼び出し、ダイアログ出力をします。


// CSV出力ボタン処理
Button csvOutputBtn = (Button) findViewById(R.id.csvOutputButton);
csvOutputBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
        confirmOutput();
    }
});

private void confirmOutput() {
    new AlertDialog.Builder(this)
            .setTitle("CSV出力")
            .setMessage(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() + System.getProperty("line.separator") +"に出力します。")
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    exportDatabase();
                }
            })
            .setNegativeButton("Cancel", null)
            .show();
}

2.CSV出力するメソッドの実装

exportDatabase()メソッドにsqliteのデータをCSV出力する実装をします。


private boolean exportDatabase() {
     // 外部ストレージがマウントされている事を確認
    String state = Environment.getExternalStorageState();
    if (!Environment.MEDIA_MOUNTED.equals(state)) {
        return false;
    } else {
        File exportDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        if (!exportDir.exists()) {
            exportDir.mkdirs();
        }

        File file;
        PrintWriter printWriter = null;
        try {
            file = new File(exportDir, "PasswordListFile.csv");
            file.createNewFile();
            printWriter = new PrintWriter(new FileWriter(file));

            SQLiteDatabase.loadLibs(this);
            ListDataOpenHelper helper = new ListDataOpenHelper(this);
            SQLiteDatabase db = helper.getReadableDatabase(LoginActivity.secretKey);

            Cursor curCSV = db.rawQuery("select * from passworddata", null);
            // CSVファイルのヘッダーを書き出し
            printWriter.println("ID,TITLE,ACCOUNT,PASSWORD,MEMO,INPUTDATE");
            // データの行数分CSV形式でデータを書き出し
            while (curCSV.moveToNext()) {
                String id = curCSV.getString(curCSV.getColumnIndex("id"));
                String title = curCSV.getString(curCSV.getColumnIndex("title"));
                String account = curCSV.getString(curCSV.getColumnIndex("account"));
                String password = curCSV.getString(curCSV.getColumnIndex("password"));
                String memo = curCSV.getString(curCSV.getColumnIndex("memo"));
                String inputdate = curCSV.getString(curCSV.getColumnIndex("inputdate"));

                String record = id + "," + title + "," + account + "," + password + "," + memo + "," + inputdate;
                printWriter.println(record);
            }

            curCSV.close();
            db.close();
        } catch (FileNotFoundException exc) {
            // フォルダへのアクセス権限がない場合の表示
            Toast ts = Toast.makeText(this, "アクセス権限がありません", Toast.LENGTH_SHORT);
            ts.show();
            return false;
        } catch (Exception exc) {
            Toast ts = Toast.makeText(this, "CSV出力が失敗しました", Toast.LENGTH_SHORT);
            ts.show();
            return false;
        } finally {
            if (printWriter != null) printWriter.close();
        }

        Toast ts = Toast.makeText(this, "CSVに出力しました", Toast.LENGTH_SHORT);
        ts.show();
        return true;
    }
}

 

以上です。

上記機能をパスワード 管理アプリ「パスワードメモ」にアップデートで追加しましたのでぜひバックアップ用途として使って下さい。