2012-05-24 6 views
14

Sto tentando di copiare DB dalla cartella delle risorse al dispositivo. Questo codice funziona perfettamente su Emulatore e dispositivo rooted. Voglio solo sapere se crea qualche problema su un dispositivo senza radici o funzionerà allo stesso modo.Copia database dalla cartella delle risorse nel dispositivo senza dirotazione

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

Sì lo snippet di codice funziona perfettamente su dispositivi senza radici troppo :) –

risposta

13

Questo funzionerà sicuramente in tutti i dispositivi e l'emulatore, senza necessità di eseguire il 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

Anche il mio codice funziona bene. Voglio solo sapere se crea qualche problema sul dispositivo senza rooting? –

+0

No di sicuro. il codice sopra funzionerà bene e anche il tuo. –

+13

** MAI PERCORSI HARDCODE **. Il valore 'outFileName' sarà errato su molti ambienti Android, come gli account secondari. Usa 'getDatabasePath()' per ricavare il percorso per un file di database. – CommonsWare

1

Non sono sicuro, ma funziona su tutti i dispositivi su cui ho provato. Ho rubato questo metodo (da qualche parte qui) e ne ha fatto generici sia per il backup e il ripristino:

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() 
    } 
} 

Poi ho solo eseguire il backup chiamando:

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

Dove getDatabasePath() e getDatabaseBackupPath() sono solo stringa valori

+0

mio codice è anche lavorando bene Voglio solo sapere è che crea alcun problema sul dispositivo senza radici? –

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

Ho dato un +1 perché la combinazione del metodo getDatabasePath() dell'oggetto contesto e outputFile.getParentFile(). mkdirs() del codice ha risolto il mio problema in cui la copia del database non funzionava quando ho usato il percorso di directory hard-coded mostrato da altri esempi. –

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(); 
}