Exporting SQLite Database to csv file in android

前端 未结 3 671
半阙折子戏
半阙折子戏 2020-11-29 03:54

I am trying to export SQLite data to SD card in android as a CSV file on a directory.

So i have tried this method below and apparently it only shows this text printe

3条回答
  •  青春惊慌失措
    2020-11-29 04:12

    In case someone still stumbles upon this question, I will post my solution, which is slightly more general than the accepted one. You should be able to export all tables in an sqlite database almost by copying the two classes below. Only other changes needed should be related to getting the application context and importing open csv.

    Some parts are pretty much copy paste from other stackoverflow threads, but I couldn't find those anymore.

    Sqlite exporter:

    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.util.Log;
    
    import com.opencsv.CSVWriter;
    
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    
    /**
     * Can export an sqlite databse into a csv file.
     *
     * The file has on the top dbVersion and on top of each table data the name of the table
     *
     * Inspired by
     * https://stackoverflow.com/questions/31367270/exporting-sqlite-database-to-csv-file-in-android
     * and some other SO threads as well.
     *
     */
    public class SqliteExporter {
        private static final String TAG = SqliteExporter.class.getSimpleName();
    
        public static final String DB_BACKUP_DB_VERSION_KEY = "dbVersion";
        public static final String DB_BACKUP_TABLE_NAME = "table";
    
        public static String export(SQLiteDatabase db) throws IOException{
            if( !FileUtils.isExternalStorageWritable() ){
                throw new IOException("Cannot write to external storage");
            }
            File backupDir = FileUtils.createDirIfNotExist(FileUtils.getAppDir() + "/backup");
            String fileName = createBackupFileName();
            File backupFile = new File(backupDir, fileName);
            boolean success = backupFile.createNewFile();
            if(!success){
                throw new IOException("Failed to create the backup file");
            }
            List tables = getTablesOnDataBase(db);
            Log.d(TAG, "Started to fill the backup file in " + backupFile.getAbsolutePath());
            long starTime = System.currentTimeMillis();
            writeCsv(backupFile, db, tables);
            long endTime = System.currentTimeMillis();
            Log.d(TAG, "Creating backup took " + (endTime - starTime) + "ms.");
    
            return backupFile.getAbsolutePath();
        }
    
        private static String createBackupFileName(){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HHmm");
            return "db_backup_" + sdf.format(new Date()) + ".csv";
        }
    
        /**
         * Get all the table names we have in db
         *
         * @param db
         * @return
         */
        public static List getTablesOnDataBase(SQLiteDatabase db){
            Cursor c = null;
            List tables = new ArrayList<>();
            try{
                c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
                if (c.moveToFirst()) {
                    while ( !c.isAfterLast() ) {
                        tables.add(c.getString(0));
                        c.moveToNext();
                    }
                }
            }
            catch(Exception throwable){
                Log.e(TAG, "Could not get the table names from db", throwable);
            }
            finally{
                if(c!=null)
                    c.close();
            }
            return tables;
        }
    
        private static void writeCsv(File backupFile, SQLiteDatabase db, List tables){
            CSVWriter csvWrite = null;
            Cursor curCSV = null;
            try {
                csvWrite = new CSVWriter(new FileWriter(backupFile));
                writeSingleValue(csvWrite, DB_BACKUP_DB_VERSION_KEY + "=" + db.getVersion());
                for(String table: tables){
                    writeSingleValue(csvWrite, DB_BACKUP_TABLE_NAME + "=" + table);
                    curCSV = db.rawQuery("SELECT * FROM " + table,null);
                    csvWrite.writeNext(curCSV.getColumnNames());
                    while(curCSV.moveToNext()) {
                        int columns = curCSV.getColumnCount();
                        String[] columnArr = new String[columns];
                        for( int i = 0; i < columns; i++){
                            columnArr[i] = curCSV.getString(i);
                        }
                        csvWrite.writeNext(columnArr);
                    }
                }
            }
            catch(Exception sqlEx) {
                Log.e(TAG, sqlEx.getMessage(), sqlEx);
            }finally {
                if(csvWrite != null){
                    try {
                        csvWrite.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if( curCSV != null ){
                    curCSV.close();
                }
            }
        }
    
        private static void writeSingleValue(CSVWriter writer, String value){
            writer.writeNext(new String[]{value});
        }
    }
    

    FileUtils:

    public class FileUtils {
    
        public static String getAppDir(){
            return App.getContext().getExternalFilesDir(null) + "/" + App.getContext().getString(R.string.app_name);
        }
    
        public static File createDirIfNotExist(String path){
            File dir = new File(path);
            if( !dir.exists() ){
                dir.mkdir();
            }
            return dir;
        }
    
        /* Checks if external storage is available for read and write */
        public static boolean isExternalStorageWritable() {
            String state = Environment.getExternalStorageState();
            return Environment.MEDIA_MOUNTED.equals(state);
        }
    
        /* Checks if external storage is available to at least read */
        public static boolean isExternalStorageReadable() {
            String state = Environment.getExternalStorageState();
            return Environment.MEDIA_MOUNTED.equals(state) ||
                    Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
        }
    }
    

    In addition to these two classes, you either need to pass context to the FileUtils, or have some other means of getting the context. In the above code App is just class extending Application for easy access to context.

    Also remember to add Opencsv to gradle, i.e.

    compile group: 'com.opencsv', name: 'opencsv', version: '4.1'
    

    Then just call the export method of the Sqlite exporter class.

提交回复
热议问题