android - file.createNewFile() 的结果;将 SQLite 数据库导出到 CSV Android Java 时被忽略
问题描述
我正在尝试使用 ExportDatabaseCSVTask 将我的 SQLite 数据库导出为 CSV。
经过几次更正后,它是这样的:
在 CatalogActivity 中单击按钮:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//export data to CSV using method in InventoryProvider via separate java class ExportDatabaseCSVTask
case R.id.export_to_csv:
tryExporting();
return true;
}
return super.onOptionsItemSelected(item);
}
public void tryExporting() {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
return;
}
new ExportDatabaseCSVTask(this).execute();
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String permissions[], @NonNull int[] grantResults) {
switch (requestCode) {
case REQUEST_READ_EXTERNAL_STORAGE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
new ExportDatabaseCSVTask(this).execute();
}
}
}
这是被触发的类
public class ExportDatabaseCSVTask extends AsyncTask<String, String, Boolean> {
SQLiteDatabase database;
private Context context;
private ProgressDialog dialog;
InventoryProvider iProvider;
InventoryDbHelper mDbHelper;
public ExportDatabaseCSVTask(Context context) {
this.context = context;
}
@Override
protected void onPreExecute() {
if (dialog == null) {
dialog = new ProgressDialog(context);
dialog.setMessage("Downloading Files... Please Wait...");
dialog.show();
}
}
@TargetApi(Build.VERSION_CODES.O)
protected Boolean doInBackground(final String... args) {
File exportDir = new File(Environment.getExternalStorageDirectory(), "/codesss/");
if (!exportDir.exists()) { exportDir.mkdirs();
if(!exportDir.mkdirs()) {
Log.e("mDebug", "Couldn't get the directory");
}
}
File file = new File(exportDir, "inventory.csv");
try {
file.createNewFile();
if(!file.createNewFile()) {
Log.e("mDebug", "Couldn't create the file"); --> ERROR HERE result is ignored error
}
CSVWriter csvWrite = new CSVWriter(new FileWriter(file));
database = this.mDbHelper.getWritableDatabase();
database = this.mDbHelper.getReadableDatabase();
Cursor curCSV = database.rawQuery("SELECT * FROM inventory", null);
csvWrite.writeNext(curCSV.getColumnNames());
while (curCSV.moveToNext()) {
String arrStr[] = null;
String[] mySecondStringArray = new String[curCSV.getColumnNames().length];
for (int i = 0; i < curCSV.getColumnNames().length; i++) {
mySecondStringArray[i] = curCSV.getString(i);
}
csvWrite.writeNext(mySecondStringArray);
}
csvWrite.close();
curCSV.close();
return true;
} catch (IOException e) {
return false;
}
}
protected void onPostExecute(final Boolean success) {
if (dialog != null) {
if (dialog.isShowing()) { dialog.dismiss();
dialog = null;
}
}
// if ((dialog != null)) { this.dialog.dismiss(); }
if (success) {
Toast.makeText(context, "Export successful!", Toast.LENGTH_SHORT).show();
ShareFile();
} else {
Toast.makeText(context, "Export failed", Toast.LENGTH_SHORT).show();
}
}
private void ShareFile() {
File exportDir = new File(Environment.getExternalStorageDirectory(), "/codesss/");
String fileName = "inventory.csv";
File sharingGifFile = new File(exportDir, fileName);
Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("application/csv");
Uri uri = Uri.fromFile(sharingGifFile);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
context.startActivity(Intent.createChooser(shareIntent, "Share CSV"));
}
}
已添加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
更新
所以,现在错误在于创建文件。file.createNewFile() 的结果;被忽略
调试显示文件夹已创建 - D/myAppName: 文件夹存在:/storage/emulated/0/codess但是,它是空的,不存在文件夹。
为这个新问题创建了单独的问题 - Exporting SQLite Database to csv file in android
解决方案
对此onPreExecute()
进行更改:
if (dialog == null) {
dialog = new ProgressDialog(context);
dialog.setMessage("Downloading Files... Please Wait...");
}
这样您就不会每次都创建新的对话框。
再次onPostExecute()
检查null
:
if (dialog != null) {
if (dialog.isShowing()) {
dialog.dismiss();
dialog = null;
}
}
此外,由于此对话框 ID 是使用上下文创建的,因此请CatalogActivity
确保在显示对话框时此活动未关闭。
也改变所有:
Toast.makeText(CatalogActivity.getApplicationContext...
和
Toast.makeText(context....
推荐阅读
- p2p - 不存在区块链的点对点网络中的智能合约
- django - Django Serlizing多个foreginkey相关模型
- python-3.7 - 是否有任何opencv函数可以将边缘添加到白色背景?
- docker - 如何在没有 root 权限的 Docker 容器中运行 TensorBoard?
- google-cloud-platform - 将表加载到 bigquery 时,每次都会引发 google.auth.exceptions.RefreshError
- multithreading - 如何从概念上解释操作系统级别的线程同步机制?
- c++ - 在 C++ 中实现具有不同数据类型值的映射
- c# - 我的 Datalist 中的按钮未添加产品
- android - 为什么 capture="user" 不能将我手机的摄像头改为前置?
- authentication - Rocket Chat,无法在“DOMWindow”上执行“postMessage”