Java 将多个表导出到多个CSV文件

Java 将多个表导出到多个CSV文件,java,android,sqlite,csv,Java,Android,Sqlite,Csv,我在应用程序中的数据库中有许多表。在应用程序使用过程中,这些表由用户创建,还包括它们的名称 我想导出所有表,每个表都要导出到一个带有表名的.CSV文件中 例如,我有3个名为1、2和3的表。我想导出并创建文件1.csv、2.csv和3.csv 我真的很感谢你的帮助,因为我在网上找不到任何答案 我正在使用一些名为CSVReader和CSVWriter的类,它们非常流行 这里用我的方法导出。不会显示任何错误,但不会导出任何文件: public void exportTables (View view)

我在应用程序中的数据库中有许多表。在应用程序使用过程中,这些表由用户创建,还包括它们的名称

我想导出所有表,每个表都要导出到一个带有表名的.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-列出表名

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;
}
你的第一个问题

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;
}
你可以这样使用它们:

SQLiteDatabase db = dbhelper.getReadableDatabase();
List<String> tableNames = listTables(db);
for(String tableName : tableNames) {
    dumpTableToCsvFile(db, tableName);
}

您的curCSV中是否返回了任何行?此外,这个tableName在新的FileexportDir、tableName+.csv中的位置;来自哪里?您应该在内部创建这些文件,而您需要在Java中这样做吗?sqlite3 shell程序使这变得简单:@Bentaye首先,感谢您的关注。我想我明白你的意思了。首先,也许我需要一个循环来读取表名并创建文件,对吗?嗯,理论上可能是这样,但我还是不知道怎么做哈哈。@Shawn哦,真的吗?因为我真的需要Java语言。这是一款Android应用程序。但很高兴知道。谢谢。非常感谢你的解释。我明白了,它成功了!!!如果你不介意,我只是发现一个陌生人的行为。。。创建.csv文件的命令在Android 5中运行良好。但在Android 6中,它不会创建文件。你知道为什么吗?约翰太棒了!对不起,我不是安卓专家。你可能需要为此提出另一个问题,我不知道是什么导致了这个问题。你介意也看看这个问题吗?