Android SQLite 的恢复与备份
1.简单备份与恢复常识
- 备份:把想要备份的数据库(*.db)拷贝到其他目录(文件夹)
- 恢复:把备份的数据库文件(*.db)拷贝回来覆盖现在已有的数据库文件
2.创建 BackupTask类
public class BackupTask extends AsyncTask<String, Void, Integer> {
private static final String COMMAND_BACKUP = "backupDatabase";
public static final String COMMAND_RESTORE = "restoreDatabase";
private Context mContext;
public BackupTask(Context context) {
this.mContext = context;
}
@Override
protected Integer doInBackground(String... params) {
// TODO Auto-generated method stub
// 获得正在使用的数据库路径,默认路径是 /data/data/(包名)/databases/*.db
File dbFile = mContext.getDatabasePath("/data/data/(包名)/databases/(数据库名).db"); // dbFile:需要备份的文件
File exportDir = new File(Environment.getExternalStorageDirectory(), "d"); //备份 dbFile 文件到 exportDir 目录
if (!exportDir.exists()) { // 判断 是否存在
exportDir.mkdirs(); //不存在则创建
}
File backup = new File(exportDir, dbFile.getName());
String command = params[0];
if (command.equals(COMMAND_BACKUP)) {
//备份时执行
try {
backup.createNewFile();
fileCopy(dbFile, backup);
return Log.d("backup", "ok");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return Log.d("backup", "fail");
}
} else if (command.equals(COMMAND_RESTORE)) {
//恢复时执行
try {
fileCopy(backup, dbFile);
return Log.d("restore", "success");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return Log.d("restore", "fail");
}
} else {
return null;
}
}
private void fileCopy(File dbFile, File backup) throws IOException {
// TODO Auto-generated method stub
FileChannel inChannel = new FileInputStream(dbFile).getChannel();
FileChannel outChannel = new FileOutputStream(backup).getChannel();
try {
inChannel.transferTo(0, inChannel.size(), outChannel);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (inChannel != null) {
inChannel.close();
}
if (outChannel != null) {
outChannel.close();
}
}
}
}
3.封装备份与恢复的方法
写在你执行备份与恢复的类中
//数据恢复
private void dataRecover() {
// TODO Auto-generated method stub
new BackupTask(this).execute("restroeDatabase");
}
//数据备份
private void dataBackup() {
// TODO Auto-generated method stub
new BackupTask(this).execute("backupDatabase");
}
4.配置 AndroidManifest.xml
//配置这一条,允许"permission"权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application>...<application/>
5.报 IOException: No such file or directory
异常
-
因为 android 读写需要权限,如果没有配置
AndroidManifest.xml
则会报No such file or directory
异常。 -
如果配置后还是报
No such file or directory
。则在动态配置权限试试。原文链接 https://blog.csdn.net/qunqunstyle99/article/details/86652731
-报No such file or directory
。则在动态配置权限试试。原文链接 https://blog.csdn.net/qunqunstyle99/article/details/86652731