从Android应用程序

时间:2017-10-11 16:24:07

标签: android database sqlite

我有一个制作SQLite数据库的应用程序。我无法导出该数据库。我只是想把它导出到手机上的文件中。我的最终目标是能够通过电子邮件发送该文件,然后能够使用该应用程序导入该文件。但那个问题是另一天。

按下导出按钮并检查手机是否有数据库备份后,即使搜索也无法找到该文件。

我还没有保存文件,所以我想看看我在这种方法中做的事情是否显然不正确。到目前为止我要经历的教程并没有帮助我指出错误。

这是我的导出数据库方法:

private void exportDB() {
    File sd = Environment.getExternalStorageDirectory();
    File data = Environment.getDataDirectory();
    FileChannel source=null;
    FileChannel destination=null;
    String currentDBPath = "/data/"+ "com.example.jeremy.sqlwine" +"/databases/"+ "wines.db";
    String backupDBPath = "wines.db";
    File currentDB = new File(data, currentDBPath);
    File backupDB = new File(sd, backupDBPath);
    try {
        source = new FileInputStream(currentDB).getChannel();
        destination = new FileOutputStream(backupDB).getChannel();
        destination.transferFrom(source, 0, source.size());
        source.close();
        destination.close();
        Toast.makeText(this, "DB Exported!", Toast.LENGTH_LONG).show();
    } catch(IOException e) {
        e.printStackTrace();
    }
}

我还在清单中添加了权限:

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

编辑:以下是最终修复它的内容。

我能够得到这个,因为用户Hamed Nabizadeh通过聊天帮助我一段时间。

他帮助排除故障并发现我错过了java代码中的权限请求。我只需将此代码添加到MainActivity,它就开始工作了。

if (ContextCompat.checkSelfPermission(MainActivity.this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        } else {
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    1);
        }
    }

1 个答案:

答案 0 :(得分:1)

private void exportDB(File db) {
        InputStream is;
        OutputStream os;
        try {
            File dest = new File(Environment.getExternalStorageDirectory(), db.getName());
            is = new FileInputStream(db);
            os = new FileOutputStream(dest);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) > 0) {
                os.write(buffer, 0, length);
            }
            is.close();
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

只需致电:

exportDB(getDatabasePath("wines.db"));

注意:In Android >= 6 Don't forgot to request permission at runtime