Экспорт нескольких таблиц в несколько файлов CSV - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть много таблиц в моей базе данных в приложении.Во время использования приложения эти таблицы создаются пользователем, а также их именами.

Я хотел бы экспортировать все таблицы, каждая из которых в один .CSV файл с именем таблицы.

Например, у меня есть 3 таблицы с именами 1, 2 и 3. Я хотел бы экспортировать, и они создают файлы 1.csv, 2.csv и 3.csv.

Я действительно ценюнекоторая помощь, потому что я не смог найти никакого ответа в сети.

Я использую некоторые классы, называемые CSVReader и CSVWriter, которые очень популярны.

Здесь в моем методе для экспорта.Ошибка не отображается, но файл не экспортируется:

public void exportTables (View view) {
    File dbFile = getDatabasePath("database.db");
    Banco dbhelper = new Banco(getApplicationContext());
    File exportDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    if (!exportDir.exists()) {
        exportDir.mkdirs();
    }

    File file = new File(exportDir, tableName +".csv");

    try {

        file.createNewFile();
        CSVWriter csvWriter = new CSVWriter(new FileWriter(file));
        SQLiteDatabase db = dbhelper.getReadableDatabase();
        Cursor curCSV = db.rawQuery("SELECT * FROM sqlite_master WHERE type='table' AND name NOT LIKE 'android_metadata' AND name NOT LIKE 'sqlite_sequence'", null);
        csvWriter.writeNext(curCSV.getColumnNames());

        while(curCSV.moveToNext()) {
            // Table columns
            String arrStr[] ={curCSV.getString(0),curCSV.getString(1)};
            csvWriter.writeNext(arrStr);
        }

        csvWriter.close();

        curCSV.close();
    }
    catch(Exception sqlEx) {
        Log.e("MainActivity", sqlEx.getMessage(), sqlEx);
    }

    Toast.makeText(this, "FILE EXPORTED WITH SUCCESS!", Toast.LENGTH_SHORT).show();
}

1 Ответ

0 голосов
/ 21 февраля 2019

Это фактически двухэтапный процесс:

1 - список имен таблиц

Ваш первый запрос

SELECT * 
FROM sqlite_master 
WHERE type='table' 
AND name NOT LIKE 'android_metadata' 
AND name NOT LIKE 'sqlite_sequence'

возвращает список таблиц и выглядит следующим образом

type  |  name  | tbl_name | rootpage |       sql        |
------+--------+----------+----------+------------------+
table | table1 |  table1  |     2    | CREATE TABLE ... |
table | table2 |  table2  |     2    | CREATE TABLE ... |
table | table3 |  table3  |     2    | CREATE TABLE ... |

Вы можете просто вернуть имена вместо всех столбцов

SELECT name
FROM sqlite_master 
WHERE type='table' 
AND name NOT LIKE 'android_metadata' 
AND name NOT LIKE 'sqlite_sequence'

Вам нужно прочитать каждую строку, чтобы получить имена таблиц

2 - Затем для каждой таблицы вынужно создать файл и запросить таблицу, например:

SELECT * FROM table1

Затем вставьте их в свой файл

КОД:

Я не тестировалэтот код, но вы должны быть в состоянии заставить его работать:

Этот первый метод выведет список имен таблиц

private static List<String> listTables(SQLiteDatabase db) {
    List<String> tableNames = new ArrayList<>();

    Cursor tableListCursor = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'android_metadata' AND name NOT LIKE 'sqlite_sequence'", null);
    while(tableListCursor.moveToNext()) {
        // get the name of the table
        tableNames.add(tableListCursor.getString(0));
    }
    tableListCursor.close();

    return tableNames;
}

Этот второй метод выведет таблицу в файл

private static void dumpTableToCsvFile(SQLiteDatabase db, String tableName) {
    try {
        // Query the data in the table
        Cursor cursor = db.rawQuery("SELECT * FROM " + tableName, null);

        File file = new File(exportDir, tableName +".csv");
        file.createNewFile();

        CSVWriter csvWriter = new CSVWriter(new FileWriter(file));
        // Write the table data to the file
        csvWriter.writeNext(cursor.getColumnNames());
        while(cursor.moveToNext()) {
            String arrStr[] = { cursor.getString(0), cursor.getString(1) };
            csvWriter.writeNext(arrStr);
        }
        // close cursor and writer
        cursor.close();
        csvWriter.close();

    } catch (IOException e) {
        // handle exception
    }
}

И вы используете их так:

SQLiteDatabase db = dbhelper.getReadableDatabase();
List<String> tableNames = listTables(db);
for(String tableName : tableNames) {
    dumpTableToCsvFile(db, tableName);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...