我有一个制作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);
}
}
答案 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