2017-10-11 58 views
0

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

当我按下导出按钮并检查电话进行数据库备份后,即使进行搜索,我也找不到该文件。

我很新,但尚未保存文件,所以我想看看我是否做了明显不正确的方法。到目前为止,我所经历的教程并没有帮助我指出错误。

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

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
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

+0

中的 “背景”, “新的文件(context.getDatabasePath(” wines.db “))” 是红“(Environment.getExternalStorageDirectory());”带下划线并且表示“无法解析构造函数'File(java.io.File)” – andrdoiddev

+0

@andrdoiddev如果您从活动调用方法,不需要t o调用上下文 –

+0

@andrdoiddev我编辑了我的答案并检查了它 –

相关问题