您的位置:首页 > 移动开发 > Android开发

android实现本程序数据的备份与恢复 分类: Android数据存储 2014-06-20 13:58 61人阅读 评论(0) 收藏

2014-06-20 13:58 836 查看
本文原创,转载爬虫请保留原文地址: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/)中。

备份与恢复的代码如下:

/*

* @(#)Backup.java Project:UniversityTimetable

* Date:2012-4-16

*

* Copyright (c) 2011 CFuture09, Institute of Software,

* Guangdong Ocean University, Zhanjiang, GuangDong, China.

* All rights reserved.

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

* http://www.apache.org/licenses/LICENSE-2.0
*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/

package com.lurencun.cfuture09.universityTimetable.backup.util;

import java.io.File;

import java.io.IOException;

import org.apache.commons.io.FileUtils;

import android.content.Context;

import android.os.Environment;

import android.widget.Toast;

import com.sinaapp.msdxblog.androidkit.util.ResourceUtil;

import com.sinaapp.msdxblog.androidkit.util.entity.ApkInfo;

/**

* @author Geek_Soledad (66704238@51uc.com)

*/

public class Backup {

private String SHARED_PREFS;

private String DATABASES;

private String APP_PATH;

private Context mContext;

private String BACKUP_PATH;

private String BACKUP_DATABASES;

private String BACKUP_SHARED_PREFS;

public Backup(Context context) {

mContext = context;

ApkInfo apkInfo = new ResourceUtil(context).getApkInfo();

APP_PATH = new StringBuilder("/data/data/").append(apkInfo.packageName)

.toString();

SHARED_PREFS = APP_PATH + "/shared_prefs";

DATABASES = APP_PATH + "/databases";

if (Environment.MEDIA_MOUNTED.equals(Environment

.getExternalStorageState())) {

BACKUP_PATH = "/sdcard/lurencun/backup";

} else {

BACKUP_PATH = "/com.lurencun/backup/";

Toast.makeText(mContext, "没有检测到SD卡,可能无法备份成功", Toast.LENGTH_SHORT)

.show();

}

BACKUP_PATH += apkInfo.packageName;

BACKUP_DATABASES = BACKUP_PATH + "/database";

BACKUP_SHARED_PREFS = BACKUP_PATH + "/shared_prefs";

}

/**

* 备份文件

*

* @return 当且仅当数据库及配置文件都备份成功时返回true。

*/

public boolean doBackup() {

return backupDB() && backupSharePrefs();

}

private boolean backupDB() {

return copyDir(DATABASES, BACKUP_DATABASES, "备份数据库文件成功:"

+ BACKUP_DATABASES, "备份数据库文件失败");

}

private boolean backupSharePrefs() {

return copyDir(DATABASES, BACKUP_DATABASES, "备份配置文件成功:"

+ BACKUP_SHARED_PREFS, "备份配置文件失败");

}

/**

* 恢复

*

* @return 当且仅当数据库及配置文件都恢复成功时返回true。

*/

public boolean doRestore() {

return restoreDB() && restoreSharePrefs();

}

private boolean restoreDB() {

return copyDir(BACKUP_DATABASES, DATABASES, "恢复数据库文件成功", "恢复数据库文件失败");

}

private boolean restoreSharePrefs() {

return copyDir(BACKUP_SHARED_PREFS, SHARED_PREFS, "恢复配置文件成功",

"恢复配置文件失败");

}

private final void showToast(String msg) {

Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();

}

/**

* 复制目录

*

* @param srcDir

* 源目录

* @param destDir

* 目标目录

* @param successMsg

* 复制成功的提示语

* @param failedMsg

* 复制失败的提示语

* @return 当复制成功时返回true, 否则返回false。

*/

private final boolean copyDir(String srcDir, String destDir,

String successMsg, String failedMsg) {

try {

FileUtils.copyDirectory(new File(srcDir), new File(destDir));

} catch (IOException e) {

e.printStackTrace();

showToast(failedMsg);

return false;

}

showToast(successMsg);

return true;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐