Как конвертировать базу данных SQLite в Android Studio, а затем поделиться им в виде CSV-файла - PullRequest
0 голосов
/ 16 сентября 2018

Я создаю приложение, в котором пользователи вставляют значения в таблицу (БД SQLite), и я хочу создать кнопку общего доступа, которая предоставит доступ к таблице в виде файла Excel (.csv).

1 Ответ

0 голосов
/ 17 сентября 2018

Ниже приведен элементарный пример.Это создаст очень простой CSV-файл, основанный на запросе, который объединяет столбцы с, между столбцами.

Таблица имеет 3 столбца с именем: -

  • _id
  • _name
  • _email

Используется эффективный запрос SELECT _id||','||_name||','||_email FROM test1;, хотя для построения SQL используется метод SQLiteDatabase query .

Метод getCSVRows класса DBHelper возвращает Курсор на основе вышеизложенного (т. Е. Один столбец, CSV, доступ к которому можно получить через смещение 0).

Каждый раз, когда приложение запускается, добавляются две строки с помощью метода addTest1Row .

В приложении есть кнопка, при нажатии которой вызывается метод crtCSV , которыйв основном: -

  1. получает имена столбцов в виде CSV (на самом деле этот метод следует использовать для управления методом getCSVRows, поскольку существует вероятность того, что имена столбцов будут в неправильном месте) и записываетстрока с этим первым.
  2. извлекает Cursor с данными в виде строки CSV и записывает строку.

Выходной файл находится в каталоге mycsvfiles каталога Downloads (только примечаниесамые основные проверки сделаны, поэтому это может не работать на некоторых устройствах).

Имя файла будет уникальным, поскольку к нему добавляется суффикс текущей временной метки.

На этом снимке экрана показаны 3 таких файла (взятых из проводника устройства Android Studio): -

enter image description here

Это показывает, что он открыт в Android Studio: -

enter image description here

И, наконец, в Excel:-

enter image description here

Вот код: -

Во-первых, поскольку требуется разрешение соответствующего раздела Manifest AndroidManifest.xml

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE">
</uses-permission>

Если приложение будет использоваться для любого устройства, которое использует API больше 22, то необходимо запросить разрешение.Таким образом, существует класс для этого, а именно ExternalStoragePermissions.java для обработки этого запроса: -

class ExternalStoragePermissions {

    public int API_VERSION = Build.VERSION.SDK_INT;
    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    public ExternalStoragePermissions() {}
    // Note call this method
    public static void verifyStoragePermissions(Activity activity) {
        int permission = ActivityCompat.checkSelfPermission(
                activity,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);

        if(permission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                    activity,
                    PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE
            );
        }
    }
}
  • , вызванный из Main.Activity

DatabaseHelper (т. Е. Подкласс SQLiteOpenHelper, как это часто используется): DBHelper.java : -

public class DBHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "mydb";
    public static final int DBVERSION = 1;

    public static final String TB_TEST1 = "test1";

    public static final String COL_TEST1_ID = BaseColumns._ID;
    public static final String COL_TEST1_NAME = "_name";
    public static final String COL_TEST1_EMAIL = "_email";
    private static final String crtTest1SQL = "CREATE TABLE IF NOT EXISTS " +
            TB_TEST1 +
            "(" +
            COL_TEST1_ID + " INTEGER PRIMARY KEY," +
            COL_TEST1_NAME + " TEXT," +
            COL_TEST1_EMAIL + " TEXT" +
            ")";


    SQLiteDatabase mDB;


    public DBHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
        mDB = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(crtTest1SQL);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    }

    public long addTest1Row(String name, String email) {
        ContentValues cv = new ContentValues();
        cv.put(COL_TEST1_NAME,name);
        cv.put(COL_TEST1_EMAIL,email);
        return mDB.insert(TB_TEST1,null,cv);
    }

    public Cursor getCSVRows(String table) {
        Cursor rv;
        String[] columns;
        switch (table) {
            case TB_TEST1:
                columns = new String[]{COL_TEST1_ID + "||','||" + COL_TEST1_NAME + "||','||" + COL_TEST1_EMAIL};
                break;
                default:
                    return null;
        }
        return mDB.query(table,columns,null,null,null,null,null);
    }

    public String getColumnsAsCSV(String table) {
        StringBuilder sb = new StringBuilder("");
        if (ifTableExists(table)) {
            Cursor csr = mDB.rawQuery("PRAGMA table_info(" +
                    table +
                    ")",null);
            boolean after_first_row = false;
            int rowsdone = 0;
            while (csr.moveToNext()) {
                if (after_first_row) {
                    sb.append(",");
                } else {
                    after_first_row = true;
                }
                sb.append(csr.getString(csr.getColumnIndex("name")));
            }
        }
        return sb.toString();
    }

    private boolean ifTableExists(String table) {
        String whereclause = "name=?";
        String[] whereargs = new String[]{table};
        Cursor csr = mDB.query("sqlite_master",null,whereclause,whereargs,null,null,null);
        int rowcount = csr.getCount();
        csr.close();
        return rowcount > 0;
    }
}

Последнее - это действие MainActivity.java

public class MainActivity extends AppCompatActivity {

    Button mConvert;
    DBHelper mDBHlpr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Need to have permission to External Storage
        if(Build.VERSION.SDK_INT >= 23) {
            ExternalStoragePermissions.verifyStoragePermissions(this);
        }

        mConvert = this.findViewById(R.id.convert_table);
        mConvert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                crtCSV(DBHelper.TB_TEST1 + String.valueOf(System.currentTimeMillis()),DBHelper.TB_TEST1);
            }
        });
        mDBHlpr = new DBHelper(this);
        mDBHlpr.addTest1Row("Fred","Fred@email.com");
        mDBHlpr.addTest1Row("Mary","mary@email.com");
    }

    private int crtCSV(String filename, String table) {
        if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            return -1;
        }
        File dir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),"mycsvfiles");
        String directory = dir.getPath();
        if (!dir.exists()) {
            dir.mkdirs();
        }
        File f = new File(directory,filename);
        try {
            f.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
            return -2;
        }
        f.delete();

        FileOutputStream fo;
        try {
            fo = new FileOutputStream(f);
        } catch (IOException e) {
            e.printStackTrace();
            return -3;
        }
        Cursor csr = mDBHlpr.getCSVRows(table);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fo));
        try {
            bw.write(mDBHlpr.getColumnsAsCSV(table));
            bw.newLine();
        } catch (IOException e) {
            e.printStackTrace();
            try {
                fo.close();
            } catch (IOException e1) {
                e1.printStackTrace();
                f.delete();
                return -4;
            }
            f.delete();
            return -5;
        }
        while (csr.moveToNext()) {
            String line = csr.getString(0);
            try {
                bw.write(line);
                bw.newLine();
            } catch (IOException e) {
                e.printStackTrace();
                try {
                    fo.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                    f.delete();
                    return -6;
                }
                f.delete();
                return -7;
            }
        }
        csr.close();
        try {
            bw.close();
            fo.flush();
            fo.close();
        } catch (IOException e) {
            e.printStackTrace();
            return -8;
        }
        return 0;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...