android实现本程序数据的备份与恢复

本文原创,转载爬虫请保留原文地址:http://maosidiaoxian.iteye.com/blog/1488067 

android中数据存储方式主要有四种,即SharePreferences,Sqlite3,文件和ContentProvider。所以要对本程序的数据进行备份,其实也就是把这些数据文件拷贝到另外的目录,在恢复时再拷贝回来。 
以下以我的一个程序为例,其中使用了SharePreferences及sqlite3两个数据存储的方法。在备份时将其拷到SD卡,恢复时再拷贝回来。由于对文件流的操作在这里不是我应该关注的地方,于是直接用了apache开源项目commons中的IO包里的FileUtils类的方法。 
在使用过程中,发现直接复制到手机中结果是操作失败,不知道是不是我权限没有添加上。不过复制到SD卡上却是成功的。 
下面的ApkInfo及ResourceUtil是我自己封装的,顾名思义,里面包含程序的图标、包名、程序名等等一系列信息,所在的包放在了google code(http://code.google.com/p/cfuture-androidkit/)有sourceforge(http://sourceforge.net/projects/cf-androidkit/files/)中。 
备份与恢复的代码如下: 
Java代码   收藏代码
  1. /* 
  2.  * @(#)Backup.java             Project:UniversityTimetable 
  3.  * Date:2012-4-16 
  4.  * 
  5.  * Copyright (c) 2011 CFuture09, Institute of Software,  
  6.  * Guangdong Ocean University, Zhanjiang, GuangDong, China. 
  7.  * All rights reserved. 
  8.  * 
  9.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  10.  *  you may not use this file except in compliance with the License. 
  11.  * You may obtain a copy of the License at 
  12.  * 
  13.  *     http://www.apache.org/licenses/LICENSE-2.0 
  14.  * 
  15.  * Unless required by applicable law or agreed to in writing, software 
  16.  * distributed under the License is distributed on an "AS IS" BASIS, 
  17.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  18.  * See the License for the specific language governing permissions and 
  19.  * limitations under the License. 
  20.  */  
  21. package com.lurencun.cfuture09.universityTimetable.backup.util;  
  22.   
  23. import java.io.File;  
  24. import java.io.IOException;  
  25.   
  26. import org.apache.commons.io.FileUtils;  
  27.   
  28. import android.content.Context;  
  29. import android.os.Environment;  
  30. import android.widget.Toast;  
  31.   
  32. import com.sinaapp.msdxblog.androidkit.util.ResourceUtil;  
  33. import com.sinaapp.msdxblog.androidkit.util.entity.ApkInfo;  
  34.   
  35. /** 
  36.  * @author Geek_Soledad ([email protected]) 
  37.  */  
  38. public class Backup {  
  39.   
  40.     private String SHARED_PREFS;  
  41.     private String DATABASES;  
  42.     private String APP_PATH;  
  43.     private Context mContext;  
  44.     private String BACKUP_PATH;  
  45.     private String BACKUP_DATABASES;  
  46.     private String BACKUP_SHARED_PREFS;  
  47.   
  48.     public Backup(Context context) {  
  49.         mContext = context;  
  50.         ApkInfo apkInfo = new ResourceUtil(context).getApkInfo();  
  51.         APP_PATH = new StringBuilder("/data/data/").append(apkInfo.packageName)  
  52.                 .toString();  
  53.         SHARED_PREFS = APP_PATH + "/shared_prefs";  
  54.         DATABASES = APP_PATH + "/databases";  
  55.         if (Environment.MEDIA_MOUNTED.equals(Environment  
  56.                 .getExternalStorageState())) {  
  57.             BACKUP_PATH = "/sdcard/lurencun/backup";  
  58.         } else {  
  59.             BACKUP_PATH = "/com.lurencun/backup/";  
  60.             Toast.makeText(mContext, "没有检测到SD卡,可能无法备份成功", Toast.LENGTH_SHORT)  
  61.                     .show();  
  62.         }  
  63.         BACKUP_PATH += apkInfo.packageName;  
  64.         BACKUP_DATABASES = BACKUP_PATH + "/database";  
  65.         BACKUP_SHARED_PREFS = BACKUP_PATH + "/shared_prefs";  
  66.     }  
  67.   
  68.     /** 
  69.      * 备份文件 
  70.      *  
  71.      * @return 当且仅当数据库及配置文件都备份成功时返回true。 
  72.      */  
  73.     public boolean doBackup() {  
  74.         return backupDB() && backupSharePrefs();  
  75.     }  
  76.   
  77.     private boolean backupDB() {  
  78.         return copyDir(DATABASES, BACKUP_DATABASES, "备份数据库文件成功:"  
  79.                 + BACKUP_DATABASES, "备份数据库文件失败");  
  80.     }  
  81.   
  82.     private boolean backupSharePrefs() {  
  83.         return copyDir(DATABASES, BACKUP_DATABASES, "备份配置文件成功:"  
  84.                 + BACKUP_SHARED_PREFS, "备份配置文件失败");  
  85.     }  
  86.   
  87.     /** 
  88.      * 恢复 
  89.      *  
  90.      * @return 当且仅当数据库及配置文件都恢复成功时返回true。 
  91.      */  
  92.     public boolean doRestore() {  
  93.         return restoreDB() && restoreSharePrefs();  
  94.     }  
  95.   
  96.     private boolean restoreDB() {  
  97.         return copyDir(BACKUP_DATABASES, DATABASES, "恢复数据库文件成功""恢复数据库文件失败");  
  98.     }  
  99.   
  100.     private boolean restoreSharePrefs() {  
  101.         return copyDir(BACKUP_SHARED_PREFS, SHARED_PREFS, "恢复配置文件成功",  
  102.                 "恢复配置文件失败");  
  103.     }  
  104.   
  105.     private final void showToast(String msg) {  
  106.         Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();  
  107.     }  
  108.   
  109.     /** 
  110.      * 复制目录 
  111.      *  
  112.      * @param srcDir 
  113.      *            源目录 
  114.      * @param destDir 
  115.      *            目标目录 
  116.      * @param successMsg 
  117.      *            复制成功的提示语 
  118.      * @param failedMsg 
  119.      *            复制失败的提示语 
  120.      * @return 当复制成功时返回true, 否则返回false。 
  121.      */  
  122.     private final boolean copyDir(String srcDir, String destDir,  
  123.             String successMsg, String failedMsg) {  
  124.         try {  
  125.             FileUtils.copyDirectory(new File(srcDir), new File(destDir));  
  126.         } catch (IOException e) {  
  127.             e.printStackTrace();  
  128.             showToast(failedMsg);  
  129.             return false;  
  130.         }  
  131.         showToast(successMsg);  
  132.         return true;  
  133.     }  
  134. }  

你可能感兴趣的:(android,数据库)