创建没有SD卡的备份数据库

时间:2014-01-15 18:15:26

标签: android database backup

我想创建我的数据库的备份,但我的手机上没有SDCARD。我想在内部存储中创建备份,但下一个代码失败......

    try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();
        if (sd.canWrite()) {
            String currentDBPath = "//storage//sdcard0//MyApp//turnos.db";
            String backupDBPath = "turnos.db";
            File currentDB = new File(data, currentDBPath);
            File backupDB = new File(sd, backupDBPath);

            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
           }
        } mensajeOK("INFO", "Copia creada.");                       
    } catch (Exception e) {
        Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG).show();
    }

我拥有WRITE_EXTERNAL_STORAGE权限。

3 个答案:

答案 0 :(得分:5)

  1. 永远没有硬编码路径

  2. //不是目录分隔符。 /是。

  3. /storage/sdcard0可能不存在 - 使用Environment.getExternalStorageDirectory()getExternalFilesDir()

  4. getDataDirectory()不太可能是相关位置

  5. 您现有的数据库,如果您将其置于正常位置,可以通过getDatabasePath()找到Context上提供的方法(例如,您的Activity

  6. 始终使用例外记录您的堆栈跟踪,例如通过Log.e(),而不是丢弃该信息,以帮助您更好地调试问题

  7. 这可能不是您当前方法的所有问题,但它应该让您开始。

答案 1 :(得分:2)

该行

String currentDBPath = "//storage//sdcard0//MyApp//turnos.db";

可能会解决您的大部分问题。

  1. 您说您没有SD卡,但正在尝试从SD卡读取文件。这可能会导致FileNotFoundException。
  2. 文件路径通常不包含//。始终是/
  3. 即使您的SD卡存在,也可能不会遵循此路径。 始终使用Environment.getExternalStorageDirectory()转到SD卡

答案 2 :(得分:0)

谢谢!在您的帮助下,我完成了数据库的备份:

    try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();
        if (sd.canWrite()) {
            String currentDBPath = "data/com.turnos/databases/Horarios";
            String backupDBPath = "BackupHorarios"; 
            File currentDB = new File(data, currentDBPath);
            File backupDB = new File(sd, backupDBPath);
            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
                Toast.makeText(getApplicationContext(), "Import Successful!", Toast.LENGTH_SHORT).show();
           }
        }           
    } catch (Exception e) {
        Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG).show();
    }