2012-05-24 3 views
14

Ich versuche, die Datenbank vom Ordner "Assets" auf das Gerät zu kopieren. Dieser Code funktioniert einwandfrei auf Emulator und gerootetem Gerät. Ich will nur wissen, ob es irgendein Problem auf einem unbewohnten Gerät erzeugt oder es funktioniert genauso.Kopieren der Datenbank aus dem Ordner "Assets" in einem nicht verwalteten Gerät

private void StoreDatabase() { 
    File DbFile = new File(
      "data/data/packagename/DBname.sqlite"); 
    if (DbFile.exists()) { 
     System.out.println("file already exist ,No need to Create"); 
    } else { 
     try { 
      DbFile.createNewFile(); 
      System.out.println("File Created successfully"); 
      InputStream is = this.getAssets().open("DBname.sqlite"); 
      FileOutputStream fos = new FileOutputStream(DbFile); 
      byte[] buffer = new byte[1024]; 
      int length = 0; 
      while ((length = is.read(buffer)) > 0) { 
       fos.write(buffer, 0, length); 
      } 
      System.out.println("File succesfully placed on sdcard"); 
      // Close the streams 
      fos.flush(); 
      fos.close(); 
      is.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 
+1

Ja Ihr Code-Snippet funktioniert perfekt auf unbewurzelte Geräte auch :) –

Antwort

13

Dies funktioniert sicher in allen Geräten und Emulator, keine Notwendigkeit, root.

/** 
* Copies your database from your local assets-folder to the just created 
* empty database in the system folder, from where it can be accessed and 
* handled. This is done by transfering bytestream. 
* */ 
private void copyDataBase(String dbname) throws IOException { 
    // Open your local db as the input stream 
    InputStream myInput = myContext.getAssets().open(dbname); 
    // Path to the just created empty db 
    File outFileName = myContext.getDatabasePath(dbname); 
    // Open the empty db as the output stream 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    // transfer bytes from the inputfile to the outputfile 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
     myOutput.write(buffer, 0, length); 
    } 
    // Close the streams 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 
} 
+0

Mein Code funktioniert auch gut Ich will nur wissen, ist es irgendein Problem auf unrooted Gerät erstellen? –

+0

Nein, sicher. Der obige Code funktioniert auch gut. –

+13

** NIE HARDCODE PFADE **. Der Wert für 'outFileName' ist in vielen Android-Umgebungen, z. B. in sekundären Konten, falsch. Verwenden Sie 'getDatabasePath()', um den Pfad für eine Datenbankdatei abzuleiten. – CommonsWare

1

Ich bin mir nicht sicher, aber das funktioniert auf jedem Gerät, das ich getestet habe. Ich habe diese Methode (von irgendwo hier) und machte es generisch für beide Sicherung und Wiederherstellung:

public static void movedb(File srcdb, File destdb) 
{ 
    try 
    { 
     if (Environment.getExternalStorageDirectory().canWrite()) 
     {     
      if (srcdb.exists()) 
      { 
       FileChannel src = new FileInputStream(srcdb).getChannel(); 
       FileChannel dst = new FileOutputStream(destdb).getChannel(); 
       dst.transferFrom(src, 0, src.size()); 
       src.close(); 
       dst.close();      
      } 
      else 
      { 
       //ERROR: "Database file references are incorrect"      
      } 
     } 
     else 
     { 
      //ERROR: "Cannot write to file" 
     } 
    } 
    catch (Exception e) 
    { 
     //ERROR: e.getMessage() 
    } 
} 

Dann habe ich es nur bis hinten durch den Aufruf:

movedb(this, getDatabasePath(getDbName()), new File(Environment.getExternalStorageDirectory(), getDatabaseBackupPath())); 

Wo getDatabasePath() und getDatabaseBackupPath() sind nur Zeichenfolge Werte

+0

Mein Code ist auch gut funktioniert Ich will nur wissen, ist es kein Problem auf unbewurzelten Gerät erstellen? –

2
/** 
* Copy database file from assets folder inside the apk to the system database path. 
* @param context Context 
* @param databaseName Database file name inside assets folder 
* @param overwrite True to rewrite on the database if exists 
* @return True if the database have copied successfully or if the database already exists without overwrite, false otherwise. 
*/ 
private boolean copyDatabaseFromAssets(Context context, String databaseName , boolean overwrite) { 

    File outputFile = context.getDatabasePath(databaseName); 
    if (outputFile.exists() && !overwrite) { 
     return true; 
    } 

    outputFile = context.getDatabasePath(databaseName + ".temp"); 
    outputFile.getParentFile().mkdirs(); 

    try { 
     InputStream inputStream = context.getAssets().open(databaseName); 
     OutputStream outputStream = new FileOutputStream(outputFile); 


     // transfer bytes from the input stream into the output stream 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = inputStream.read(buffer)) > 0) { 
      outputStream.write(buffer, 0, length); 
     } 

     // Close the streams 
     outputStream.flush(); 
     outputStream.close(); 
     inputStream.close(); 

     outputFile.renameTo(context.getDatabasePath(databaseName)); 

    } catch (IOException e) { 
     if (outputFile.exists()) { 
      outputFile.delete(); 
     } 
     return false; 
    } 

    return true; 
} 
+0

Ich gab eine +1, weil die Kombination der Methode getDatabasePath() des Kontextobjekts und outputFile.getParentFile() .mkdirs() Ihres Codes mein Problem löste, in dem das Kopieren der Datenbank fehlschlug, als ich das verwendete fest codierten Verzeichnispfad, die andere Beispiele zeigen. –

0
private void copyDataBase(Context context) throws IOException { 

    //Log.i(TAG, "Opening Asset..."); 
    // Open your local db as the input stream 
    InputStream myInput = context.getAssets().open(DBHelper.DATABASE_NAME); 

    // Log.i(TAG, "Getting db path..."); 
    // Path to the just created empty db 
    File dbFile = getDatabasePath(DBHelper.DATABASE_NAME); 

    if (!dbFile.exists()) { 
     SQLiteDatabase checkDB = context.openOrCreateDatabase(DBHelper.DATABASE_NAME, context.MODE_PRIVATE, null); 
     if (checkDB != null) { 
      checkDB.close(); 
     } 
    } 

    //Log.i(TAG, "Getting output stream..."); 
    // Open the empty db as the output stream 
    OutputStream myOutput = new FileOutputStream(dbFile); 

    // Log.i(TAG, "Writing data..."); 
    // transfer bytes from the inputfile to the outputfile 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
     myOutput.write(buffer, 0, length); 
    } 
    // Close the streams 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 
} 
Verwandte Themen