java - 将多个表导出到多个 CSV 文件
问题描述
我在应用程序的数据库中有很多表。在应用程序使用期间,这些表由用户及其名称创建。
我想导出所有表,每个表都带有表名的单个.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 - 列出表名
您的第一个查询
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);
}
推荐阅读
- python - 如何去除二进制图像中未连接到循环的白色像素
- reactjs - next.js/react 如何从无头 cms 创建页面
- typescript - 如何在现有的基于 ES6 的 ReactJS 应用程序中使用 TypeScript?
- gitkraken - Plastic SCM 是否与(玩得好)gitKracken 一起工作?
- delphi - 如何让 IDE 知道我使用了祖先变量?
- powershell - 在 foreach powershell 中添加值
- java - Spring mongo 存储库 crud 结合标准
- python - 如何删除 /r 并解决我在使用 BeautifulSoup 时遇到的奇怪的格式问题?
- python - 为什么我不能在 pycharm 编辑器中导入 pyperclip?
- android - IllegalStateException:reasonPhrase 在 Android WebView 中不能为空