Ниже приведен элементарный пример.Это создаст очень простой CSV-файл, основанный на запросе, который объединяет столбцы с, между столбцами.
Таблица имеет 3 столбца с именем: -
Используется эффективный запрос SELECT _id||','||_name||','||_email FROM test1;
, хотя для построения SQL используется метод SQLiteDatabase query .
Метод getCSVRows класса DBHelper возвращает Курсор на основе вышеизложенного (т. Е. Один столбец, CSV, доступ к которому можно получить через смещение 0).
Каждый раз, когда приложение запускается, добавляются две строки с помощью метода addTest1Row .
В приложении есть кнопка, при нажатии которой вызывается метод crtCSV , которыйв основном: -
- получает имена столбцов в виде CSV (на самом деле этот метод следует использовать для управления методом getCSVRows, поскольку существует вероятность того, что имена столбцов будут в неправильном месте) и записываетстрока с этим первым.
- извлекает Cursor с данными в виде строки CSV и записывает строку.
Выходной файл находится в каталоге mycsvfiles каталога Downloads (только примечаниесамые основные проверки сделаны, поэтому это может не работать на некоторых устройствах).
Имя файла будет уникальным, поскольку к нему добавляется суффикс текущей временной метки.
На этом снимке экрана показаны 3 таких файла (взятых из проводника устройства Android Studio): -

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

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

Вот код: -
Во-первых, поскольку требуется разрешение соответствующего раздела 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;
}
}