2012-09-19 10 views
5

Wenn Sie den Emulator verwenden, wird Ihre SQLite-Datei in einem Ordner in der Nähe Ihres Hauptanwendungsordners gespeichert und Sie können ihn herunterladen. Diese Funktion ist jedoch in nicht gerooteten Geräten nicht verfügbar. Wie kann ich diese vorhandene SQLite-Datei in SD-Karte programmgesteuert sichern?Wie kann ich sqlite-Datei in SD-Karte programmgesteuert sichern?

Ich möchte eine Schaltfläche in meiner Anwendung haben, die diese Datei in einem speziellen Pfad auf meiner SD-Karte speichert. Ist es möglich?

Danke,

+0

ähnliche Frage hier http://stackoverflow.com/questions/1995320/how- to-backup-database-file-to-sdcard-on-android –

+0

es sagt nicht, wie Sie die vorhandene Datenbank auf SD-Karte kopieren können – breceivemail

Antwort

16

du versuchen, für mich arbeiten, denken Sie daran, die WRITE_EXTERNAL_STORAGE Erlaubnis in Ihrem Manifest zu erhalten:

// Copy to sdcard for debug use 
    public static void copyDatabase(Context c, String DATABASE_NAME) { 
     String databasePath = c.getDatabasePath(DATABASE_NAME).getPath(); 
     File f = new File(databasePath); 
     OutputStream myOutput = null; 
     InputStream myInput = null; 
     Log.d("testing", " testing db path " + databasePath); 
     Log.d("testing", " testing db exist " + f.exists()); 

     if (f.exists()) { 
      try { 

       File directory = new File("/mnt/sdcard/DB_DEBUG"); 
       if (!directory.exists()) 
        directory.mkdir(); 

       myOutput = new FileOutputStream(directory.getAbsolutePath() 
         + "/" + DATABASE_NAME); 
       myInput = new FileInputStream(databasePath); 

       byte[] buffer = new byte[1024]; 
       int length; 
       while ((length = myInput.read(buffer)) > 0) { 
        myOutput.write(buffer, 0, length); 
       } 

       myOutput.flush(); 
      } catch (Exception e) { 
      } finally { 
       try { 
        if (myOutput != null) { 
         myOutput.close(); 
         myOutput = null; 
        } 
        if (myInput != null) { 
         myInput.close(); 
         myInput = null; 
        } 
       } catch (Exception e) { 
       } 
      } 
     } 
    } 
1

Sie folgenden Code versuchen können,

String path = Environment.getExternalStorageDirectory().toString() + "/path"; 
File folder = new File(path); 
if (!folder.exists()) 
{ 
    folder.mkdirs(); 
} 

File dbfile = new File(path + "/database.db"); 
if (!dbfile.exists()) 
{ 
    dbFile.createFile(); 
} 
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null); 
+0

dies ** nicht ** die vorhandene Datenbank kopieren. ** erstellt ** in diesem Pfad. – breceivemail

+0

@breceivemail gemäß Ihrer vorherigen Frage Titel ** Wie kann ich sqlite Datei in SD-Karte programmgesteuert speichern? **, es erfüllt die Anforderung ordnungsgemäß. – Lucifer

1

Sie kann dies versuchen, um eine Datei zu kopieren:

public void copyFile(File in, File out) { 
     String DialogTitel = getString(R.string.daten_wait_titel); 
     String DialogText = getString(R.string.kopiervorgang_laeuft); 
     try { 
      // Dialogdefinition Prograssbar 
      final ProgressDialog dialog = new ProgressDialog(this) { 
       @Override 
       public boolean onSearchRequested() { 
        return false; 
       } 
      }; 
      dialog.setCancelable(false); 
      dialog.setTitle(DialogTitel); 
      dialog.setIcon(R.drawable.icon); 
      dialog.setMessage(DialogText); 
      dialog.show(); 
      new Thread(new MyCopyThread(in, out)) { 
       @Override 
       public void run() { 
        try { 
         FileChannel inChannel = new FileInputStream(
           MyCopyThread.in).getChannel(); 
         FileChannel outChannel = new FileOutputStream(
           MyCopyThread.out).getChannel(); 
         try { 
          System.out.println("KOPIEREN"); 
          inChannel.transferTo(0, inChannel.size(), 
            outChannel); 
          if (inChannel != null) 
           inChannel.close(); 
          if (outChannel != null) 
           outChannel.close(); 
          setCopyError(false); 
         } catch (IOException e) { 
          setCopyError(true); 
          // throw e; 
         } finally { 
          if (inChannel != null) 
           inChannel.close(); 
          if (outChannel != null) 
           outChannel.close(); 
         } 
         dialog.dismiss(); 
         // Abschlussarbeiten 
         if (useExternalSD == true) { 
          // Externe DB 
          moveDBtoExternFinish(); 
         } else { 
          // Interne DB 
          moveDBtoInternFinish(); 
         } 
         moveDBFinishHandler.sendMessage(moveDBFinishHandler 
           .obtainMessage()); 
        } catch (Exception ex) { 

        } 
       } 
      }.start(); 
     } catch (Exception exx) { 

     } 

    } 

Dies ist der Code die filname Ihrer internen db zu erhalten:

File interneDB = getApplicationContext().getDatabasePath(MY_DB_NAME); 

ersetzen MY_DB_NAME mit dem Namen Ihrer DB