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.
- Cómo seleccionar datos entre dos intervalos de fechas en android SQLite
- Android Studios: Android Device Manager no muestra archivos para Nougat 7.0 en el Explorador de archivos
- Mantener los datos SQLite después de la actualización
- Citas simples en sqlite en android
- ¿Por qué INSERTs y UPDATEs son más lentos en Android 4.0?
- GreenDao freemaker.jar está ausente
- Cómo almacenar una imagen en la base de datos android
- Utilizar la instrucción LIMIT en una consulta SQLite
- ¿Cómo se obtiene el tipo de un cursor?
- Android sqlite ordenar en la columna calculada (coordina la distancia)
- Cómo obtener el registro de llamadas desde fecha específica en android
- Copia dos bases de datos SQLite en la carpeta de activos de Android
- Android: SQLite usando base de datos incorrecta
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
- Cómo configurar el color de un borde de desvanecimiento Android ScrollView?
- Nueva actividad en Android "entrar desde el lado"