Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simple export and import of a SQLite database on Android

I am trying to implement a simple SQLite export/import for backup purposes. Export is just a matter of storing a copy of the raw current.db file. What I want to do for import is to just delete the old current.db file and rename the imported.db file to current.db. Is this possible? When I try this solution, I get the following error:

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

If I look at the raw database file in a SQLite browser it looks fine.

like image 452
android_sqlite Avatar asked Jun 30 '11 20:06

android_sqlite


2 Answers

I use this code in the SQLiteOpenHelper in one of my applications to import a database file.

EDIT: I pasted my FileUtils.copyFile() method into the question.

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

Don't forget to delete the old database file if necessary.

like image 156
Austyn Mahoney Avatar answered Oct 05 '22 09:10

Austyn Mahoney


This is a simple method to export the database to a folder named backup folder you can name it as you want and a simple method to import the database from the same folder 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();              }         }      } 

Dont forget to add this permission to proceed it

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

Enjoy

like image 23
Yasin Hassanien Avatar answered Oct 05 '22 09:10

Yasin Hassanien