The following code shows how to Backup database to external storage.
Set permission for WRITE_EXTERNAL_STORAGE
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.java2s.myapplication3.app" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <uses-permission android:name="com.java2s.myapplication3.app.READ_PREFERENCES" /> <uses-permission android:name="com.java2s.myapplication3.app.WRITE_PREFERENCES" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="java2s.com" android:theme="@style/AppTheme" > <activity android:name="com.java2s.myapplication3.app.MainActivity" android:label="java2s.com" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Main layout xml file
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>
Main activity Java code
package com.java2s.myapplication3.app; /*from w ww. j a va 2 s .c om*/ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; import android.content.Context; import android.os.AsyncTask; import android.os.Environment; import android.app.Activity; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.os.Environment; import android.widget.Toast; public class MainActivity extends Activity implements BackupTask.CompletionListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SQLiteDatabase db = openOrCreateDatabase("mydb", Activity.MODE_PRIVATE, null); db.close(); } @Override public void onResume() { super.onResume(); if( Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ) { BackupTask task = new BackupTask(this); task.setCompletionListener(this); task.execute(BackupTask.COMMAND_RESTORE); } } @Override public void onPause() { super.onPause(); if( Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ) { BackupTask task = new BackupTask(this); task.execute(BackupTask.COMMAND_BACKUP); } } @Override public void onBackupComplete() { Toast.makeText(this, "Backup Successful", Toast.LENGTH_SHORT).show(); } @Override public void onError(int errorCode) { if(errorCode == BackupTask.RESTORE_NOFILEERROR) { Toast.makeText(this, "No Backup Found to Restore", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Error During Operation: "+errorCode, Toast.LENGTH_SHORT).show(); } } @Override public void onRestoreComplete() { Toast.makeText(this, "Restore Successful", Toast.LENGTH_SHORT).show(); } } class BackupTask extends AsyncTask<String,Void,Integer> { public interface CompletionListener { void onBackupComplete(); void onRestoreComplete(); void onError(int errorCode); } public static final int BACKUP_SUCCESS = 1; public static final int RESTORE_SUCCESS = 2; public static final int BACKUP_ERROR = 3; public static final int RESTORE_NOFILEERROR = 4; public static final String COMMAND_BACKUP = "backupDatabase"; public static final String COMMAND_RESTORE = "restoreDatabase"; private Context mContext; private CompletionListener listener; public BackupTask(Context context) { super(); mContext = context; } public void setCompletionListener(CompletionListener aListener) { listener = aListener; } @Override protected Integer doInBackground(String... params) { File dbFile = mContext.getDatabasePath("mydb"); File exportDir = new File(Environment.getExternalStorageDirectory(), "myAppBackups"); if (!exportDir.exists()) { exportDir.mkdirs(); } File backup = new File(exportDir, dbFile.getName()); String command = params[0]; if(command.equals(COMMAND_BACKUP)) { //Attempt file copy try { backup.createNewFile(); fileCopy(dbFile, backup); return BACKUP_SUCCESS; } catch (IOException e) { return BACKUP_ERROR; } } else if(command.equals(COMMAND_RESTORE)) { //Attempt file copy try { if(!backup.exists()) { return RESTORE_NOFILEERROR; } dbFile.createNewFile(); fileCopy(backup, dbFile); return RESTORE_SUCCESS; } catch (IOException e) { return BACKUP_ERROR; } } else { return BACKUP_ERROR; } } @Override protected void onPostExecute(Integer result) { switch(result) { case BACKUP_SUCCESS: if(listener != null) { listener.onBackupComplete(); } break; case RESTORE_SUCCESS: if(listener != null) { listener.onRestoreComplete(); } break; case RESTORE_NOFILEERROR: if(listener != null) { listener.onError(RESTORE_NOFILEERROR); } break; default: if(listener != null) { listener.onError(BACKUP_ERROR); } } } private void fileCopy(File source, File dest) throws IOException { FileChannel inChannel = new FileInputStream(source).getChannel(); FileChannel outChannel = new FileOutputStream(dest).getChannel(); try { inChannel.transferTo(0, inChannel.size(), outChannel); } finally { if (inChannel != null) inChannel.close(); if (outChannel != null) outChannel.close(); } } }