Android Java:将SQLite导出为CSV-没有创建文件夹路径或文件的问题

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

我已经为此工作了好几天了。到目前为止,根据本网站和外部的其他帖子,我已经添加了权限,并调用了权限检查方法。但是,我一直坚持导出文件。我的方法看起来不错,因为它表明导出成功。但是,没有创建任何文件或文件夹。 路径或创建文件夹操作可能有问题?:(

这是我的最新代码

1.在清单和目录活动中添加的权限:

    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

感谢您的帮助!

我已经解决了这个问题:

  • 除了在方法中添加写入权限之外 (以前,我只在方法中拥有读取权限,在清单中拥有这两个权限)

  • 在查询游标之前还添加了以下内容(删除此项,并声明为SQLiteDatabase)

  • (以前是
    database=this.mDbHelper.getReadableDatabase();


    现在,文件可以很好地保存在指定的位置。

    是否使用其他目录进行了检查?请尝试使用Environment.getExternalStorageDirectory()+“/Android/data/your_package_name/”你把Oreo作为目标有什么原因吗?嗨,安东,非常感谢你的回复。是的,我以前试过getExternalStorageDirectory,现在试过各种文件夹。它说文件夹存在/storage/emulated/0/Android/data/packagename,但那个位置没有文件夹(尽管还有其他应用程序包文件夹).你说得对,删除了Oreo的标签,同样的问题仍然存在。我想下一步将是检查你实际导出csv文件的代码。我肯定这会给你一个例外,因为正如你提到的,它似乎一直工作到那一点。好吧,如果我真的导出,你是什么意思?在提供的位置没有文件夹或文件,so未导出任何内容。请澄清?谢谢!我的意思是,在您尝试创建文件并将数据导出到CSV文件后,肯定会出现问题。为了检查问题所在,您应该使用“调试”,并在创建CSV文件后检查是否出现异常。