Android Java:将SQLite导出为CSV-没有创建文件夹路径或文件的问题
我已经为此工作了好几天了。到目前为止,根据本网站和外部的其他帖子,我已经添加了权限,并调用了权限检查方法。但是,我一直坚持导出文件。我的方法看起来不错,因为它表明导出成功。但是,没有创建任何文件或文件夹。 路径或创建文件夹操作可能有问题?:( 这是我的最新代码 1.在清单和目录活动中添加的权限:Android Java:将SQLite导出为CSV-没有创建文件夹路径或文件的问题,android,sqlite,export-to-csv,Android,Sqlite,Export To Csv,我已经为此工作了好几天了。到目前为止,根据本网站和外部的其他帖子,我已经添加了权限,并调用了权限检查方法。但是,我一直坚持导出文件。我的方法看起来不错,因为它表明导出成功。但是,没有创建任何文件或文件夹。 路径或创建文件夹操作可能有问题?:( 这是我的最新代码 1.在清单和目录活动中添加的权限: public boolean onOptionsItemSelected (MenuItem item) { //export data to CSV using method
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 super.onOptionsItemSelected(item);
}
public class ExportDatabaseCSVTask extends AsyncTask<String, String, Boolean> {
SQLiteDatabase database;
private Context context;
private ProgressDialog dialog;
InventoryProvider iProvider;
InventoryDbHelper mDbHelper;
File file = null;
boolean bool = false;
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.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "/Inventory/");
int result = 0;
if (!exportDir.exists()) {
Log.d("My App", "folder exist:" + exportDir.toString());
result = 2;
} else
try {
if (exportDir.mkdirs()) {
Log.d("My App", "folder created:" + exportDir.toString());
result = 1; // folder created
} else {
Log.d("My App", "create folder fails:" + exportDir.toString());
result = 0; // creat folder fails
}
}catch (Exception ecp){
ecp.printStackTrace();
}
file = new File(exportDir,"File.csv");
try {
bool = file.createNewFile();
// prints
System.out.println("File created: "+bool);
if (!file.createNewFile()) {
Log.e("APP", "Couldn't create the file");
System.out.println("APP: File already exists");
}
CSVWriter csvWrite = new CSVWriter(new FileWriter(file));
database = this.mDbHelper.getWritableDatabase();
database = this.mDbHelper.getReadableDatabase();
Cursor curCSV = database.rawQuery("SELECT * FROM inventory", null); ---- ERROR HERE
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.flush(); ---> not sure about this one
csvWrite.close();
curCSV.close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
protected void onPostExecute(final Boolean success) {
if (dialog != null) {
if (dialog.isShowing()) { dialog.dismiss();
dialog = null;
}
}
if (success) {
Toast.makeText(context, "Export successful!", Toast.LENGTH_SHORT).show();
//ShareFile();
} else {
Toast.makeText(context, "Export failed", Toast.LENGTH_SHORT).show();
}
}
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor com.example.android.app.data.InventoryProvider.exportQuery(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String)' on a null object reference
读外部存储器和写外部存储器
2.单击按钮后,将触发tryExporting()。
目录活动中额外创建的权限请求的方法:
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 super.onOptionsItemSelected(item);
}
public class ExportDatabaseCSVTask extends AsyncTask<String, String, Boolean> {
SQLiteDatabase database;
private Context context;
private ProgressDialog dialog;
InventoryProvider iProvider;
InventoryDbHelper mDbHelper;
File file = null;
boolean bool = false;
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.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "/Inventory/");
int result = 0;
if (!exportDir.exists()) {
Log.d("My App", "folder exist:" + exportDir.toString());
result = 2;
} else
try {
if (exportDir.mkdirs()) {
Log.d("My App", "folder created:" + exportDir.toString());
result = 1; // folder created
} else {
Log.d("My App", "create folder fails:" + exportDir.toString());
result = 0; // creat folder fails
}
}catch (Exception ecp){
ecp.printStackTrace();
}
file = new File(exportDir,"File.csv");
try {
bool = file.createNewFile();
// prints
System.out.println("File created: "+bool);
if (!file.createNewFile()) {
Log.e("APP", "Couldn't create the file");
System.out.println("APP: File already exists");
}
CSVWriter csvWrite = new CSVWriter(new FileWriter(file));
database = this.mDbHelper.getWritableDatabase();
database = this.mDbHelper.getReadableDatabase();
Cursor curCSV = database.rawQuery("SELECT * FROM inventory", null); ---- ERROR HERE
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.flush(); ---> not sure about this one
csvWrite.close();
curCSV.close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
protected void onPostExecute(final Boolean success) {
if (dialog != null) {
if (dialog.isShowing()) { dialog.dismiss();
dialog = null;
}
}
if (success) {
Toast.makeText(context, "Export successful!", Toast.LENGTH_SHORT).show();
//ShareFile();
} else {
Toast.makeText(context, "Export failed", Toast.LENGTH_SHORT).show();
}
}
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor com.example.android.app.data.InventoryProvider.exportQuery(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String)' on a null object reference
3.ExportDatabaseCSVTask类:
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 super.onOptionsItemSelected(item);
}
public class ExportDatabaseCSVTask extends AsyncTask<String, String, Boolean> {
SQLiteDatabase database;
private Context context;
private ProgressDialog dialog;
InventoryProvider iProvider;
InventoryDbHelper mDbHelper;
File file = null;
boolean bool = false;
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.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "/Inventory/");
int result = 0;
if (!exportDir.exists()) {
Log.d("My App", "folder exist:" + exportDir.toString());
result = 2;
} else
try {
if (exportDir.mkdirs()) {
Log.d("My App", "folder created:" + exportDir.toString());
result = 1; // folder created
} else {
Log.d("My App", "create folder fails:" + exportDir.toString());
result = 0; // creat folder fails
}
}catch (Exception ecp){
ecp.printStackTrace();
}
file = new File(exportDir,"File.csv");
try {
bool = file.createNewFile();
// prints
System.out.println("File created: "+bool);
if (!file.createNewFile()) {
Log.e("APP", "Couldn't create the file");
System.out.println("APP: File already exists");
}
CSVWriter csvWrite = new CSVWriter(new FileWriter(file));
database = this.mDbHelper.getWritableDatabase();
database = this.mDbHelper.getReadableDatabase();
Cursor curCSV = database.rawQuery("SELECT * FROM inventory", null); ---- ERROR HERE
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.flush(); ---> not sure about this one
csvWrite.close();
curCSV.close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
protected void onPostExecute(final Boolean success) {
if (dialog != null) {
if (dialog.isShowing()) { dialog.dismiss();
dialog = null;
}
}
if (success) {
Toast.makeText(context, "Export successful!", Toast.LENGTH_SHORT).show();
//ShareFile();
} else {
Toast.makeText(context, "Export failed", Toast.LENGTH_SHORT).show();
}
}
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor com.example.android.app.data.InventoryProvider.exportQuery(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String)' on a null object reference
感谢您的帮助!我已经解决了这个问题:
database=this.mDbHelper.getReadableDatabase();
)
现在,文件可以很好地保存在指定的位置。是否使用其他目录进行了检查?请尝试使用Environment.getExternalStorageDirectory()+“/Android/data/your_package_name/”你把Oreo作为目标有什么原因吗?嗨,安东,非常感谢你的回复。是的,我以前试过getExternalStorageDirectory,现在试过各种文件夹。它说文件夹存在/storage/emulated/0/Android/data/packagename,但那个位置没有文件夹(尽管还有其他应用程序包文件夹).你说得对,删除了Oreo的标签,同样的问题仍然存在。我想下一步将是检查你实际导出csv文件的代码。我肯定这会给你一个例外,因为正如你提到的,它似乎一直工作到那一点。好吧,如果我真的导出,你是什么意思?在提供的位置没有文件夹或文件,so未导出任何内容。请澄清?谢谢!我的意思是,在您尝试创建文件并将数据导出到CSV文件后,肯定会出现问题。为了检查问题所在,您应该使用“调试”,并在创建CSV文件后检查是否出现异常。