2010-05-11 14 views
45

Estoy utilizando el código de abajo para escribir una copia de seguridad de tarjeta SD y me saleHacer una copia de seguridad de base de datos de tarjeta SD en Android

java.io.IOException: Parent directory of file is not writable: /sdcard/mydbfile.db

private class ExportDatabaseFileTask extends AsyncTask<String, Void, Boolean> { 
     private final ProgressDialog dialog = new ProgressDialog(ctx); 

     // can use UI thread here 
     protected void onPreExecute() { 
      this.dialog.setMessage("Exporting database..."); 
      this.dialog.show(); 
     } 

     // automatically done on worker thread (separate from UI thread) 
     protected Boolean doInBackground(final String... args) { 

      File dbFile = 
        new File(Environment.getDataDirectory() + "/data/com.mypkg/databases/mydbfile.db"); 

      File exportDir = new File(Environment.getExternalStorageDirectory(), ""); 
      if (!exportDir.exists()) { 
       exportDir.mkdirs(); 
      } 
      File file = new File(exportDir, dbFile.getName()); 

      try { 
       file.createNewFile(); 
       this.copyFile(dbFile, file); 
       return true; 
      } catch (IOException e) { 
       Log.e("mypck", e.getMessage(), e); 
       return false; 
      } 
     } 

     // can use UI thread here 
     protected void onPostExecute(final Boolean success) { 
      if (this.dialog.isShowing()) { 
       this.dialog.dismiss(); 
      } 
      if (success) { 
       Toast.makeText(ctx, "Export successful!", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(ctx, "Export failed", Toast.LENGTH_SHORT).show(); 
      } 
     } 

     void copyFile(File src, File dst) throws IOException { 
      FileChannel inChannel = new FileInputStream(src).getChannel(); 
      FileChannel outChannel = new FileOutputStream(dst).getChannel(); 
      try { 
       inChannel.transferTo(0, inChannel.size(), outChannel); 
      } finally { 
       if (inChannel != null) 
       inChannel.close(); 
       if (outChannel != null) 
       outChannel.close(); 
      } 
     } 

    } 
+0

Gran publicación, gracias. Verifiqué que este código funciona para copiar la base de datos a la tarjeta sd. – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

+7

Su pregunta es una solución para mí. Gracias! ;) –

+3

Este es un gran truco. Pero quiero saber cómo restaurar esa copia de seguridad .. –

Respuesta

33

¿Se han definido permisos de manifiesto?

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