Simple exportación e importación de una base de datos SQLite en Android

Estoy intentando implementar una exportación / importación SQLite sencilla para fines de copia de seguridad. La exportación es sólo una cuestión de almacenar una copia del archivo raw current.db . Lo que quiero hacer para importar es simplemente eliminar el archivo current.db antiguo y cambiar el nombre del archivo current.db a current.db . es posible? Cuando intento esta solución, consigo el error siguiente:

 06-30 13:33:38.831: ERROR/SQLiteOpenHelper(23570): android.database.sqlite.SQLiteDatabaseCorruptException: error code 11: database disk image is malformed 

Si miro el archivo de base de datos en un navegador SQLite que parece bien.

Yo uso este código en el SQLiteOpenHelper en una de mis aplicaciones para importar un archivo de base de datos.

EDIT: FileUtils.copyFile() mi método FileUtils.copyFile() en la pregunta.

SQLiteOpenHelper

 public static String DB_FILEPATH = "/data/data/{package_name}/databases/database.db"; /** * Copies the database file at the specified location over the current * internal application database. * */ public boolean importDatabase(String dbPath) throws IOException { // Close the SQLiteOpenHelper so it will commit the created empty // database to internal storage. close(); File newDb = new File(dbPath); File oldDb = new File(DB_FILEPATH); if (newDb.exists()) { FileUtils.copyFile(new FileInputStream(newDb), new FileOutputStream(oldDb)); // Access the copied database so SQLiteHelper will cache it and mark // it as created. getWritableDatabase().close(); return true; } return false; } 

FileUtils

 public class FileUtils { /** * Creates the specified <code>toFile</code> as a byte for byte copy of the * <code>fromFile</code>. If <code>toFile</code> already exists, then it * will be replaced with a copy of <code>fromFile</code>. The name and path * of <code>toFile</code> will be that of <code>toFile</code>.<br/> * <br/> * <i> Note: <code>fromFile</code> and <code>toFile</code> will be closed by * this function.</i> * * @param fromFile * - FileInputStream for the file to copy from. * @param toFile * - FileInputStream for the file to copy to. */ public static void copyFile(FileInputStream fromFile, FileOutputStream toFile) throws IOException { FileChannel fromChannel = null; FileChannel toChannel = null; try { fromChannel = fromFile.getChannel(); toChannel = toFile.getChannel(); fromChannel.transferTo(0, fromChannel.size(), toChannel); } finally { try { if (fromChannel != null) { fromChannel.close(); } } finally { if (toChannel != null) { toChannel.close(); } } } } } 

No olvide borrar el archivo de base de datos antiguo si es necesario.

Este es un método sencillo para exportar la base de datos a una carpeta llamada carpeta de copia de seguridad que puede nombrar como desee y un método sencillo para importar la base de datos desde la misma carpeta a

  public class ExportImportDB extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); //creating a new folder for the database to be backuped to File direct = new File(Environment.getExternalStorageDirectory() + "/Exam Creator"); if(!direct.exists()) { if(direct.mkdir()) { //directory is created; } } exportDB(); importDB(); } //importing database private void importDB() { // TODO Auto-generated method stub try { File sd = Environment.getExternalStorageDirectory(); File data = Environment.getDataDirectory(); if (sd.canWrite()) { String currentDBPath= "//data//" + "PackageName" + "//databases//" + "DatabaseName"; String backupDBPath = "/BackupFolder/DatabaseName"; File backupDB= new File(data, currentDBPath); File currentDB = new File(sd, backupDBPath); FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); Toast.makeText(getBaseContext(), backupDB.toString(), Toast.LENGTH_LONG).show(); } } catch (Exception e) { Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG) .show(); } } //exporting database private void exportDB() { // TODO Auto-generated method stub try { File sd = Environment.getExternalStorageDirectory(); File data = Environment.getDataDirectory(); if (sd.canWrite()) { String currentDBPath= "//data//" + "PackageName" + "//databases//" + "DatabaseName"; String backupDBPath = "/BackupFolder/DatabaseName"; File currentDB = new File(data, currentDBPath); File backupDB = new File(sd, backupDBPath); FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); Toast.makeText(getBaseContext(), backupDB.toString(), Toast.LENGTH_LONG).show(); } } catch (Exception e) { Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG) .show(); } } } 

No se olvide de añadir este permiso para proceder

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

Disfrutar

  • ¿Podemos actualizar el APK en Google Play Store sin cambiar la versión de APP
  • SQLiteDatabase transacción anidada y solución alternativa
  • Android SQLiteOpenHelper no puede abrir el archivo de base de datos
  • Cómo cargar más de 1 MB de datos desde sqlite db al cursor de Android?
  • Se eliminó la base de datos de Sqlite cuando borro datos de la aplicación
  • Cómo concat columnas en Android sqlite
  • No se puede INSERTAR en SQLite, Código de error: 19
  • SQLIte DROP tabla ROLL volver
  • Cómo agregar segunda tabla en la base de datos en sqlite?
  • Búsqueda acentuada en sqlite (android)
  • Cómo implementar Exportar sqlite Para sobresalir / archivo csv en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.