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

标签: android 程序 数据 | 发表时间:2012-04-17 02:25 | 作者:
出处:http://www.iteye.com
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 ([email protected])
 */
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;
	}
}


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [android 程序 数据] 推荐:

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

- - ITeye博客
android中数据存储方式主要有四种,即SharePreferences,Sqlite3,文件和ContentProvider. 所以要对本程序的数据进行备份,其实也就是把这些数据文件拷贝到另外的目录,在恢复时再拷贝回来. 以下以我的一个程序为例,其中使用了SharePreferences及sqlite3两个数据存储的方法.

将android程序中的数据库导出到SD卡

- - CSDN博客移动开发推荐文章
String DATABASE_NAME = "数据库文件名称";. InputStream inStream = new FileInputStream(oldPath); // 读入原文件. bytesum += byteread; // 字节数 文件大小. System.out.println("复制单个文件操作出错");.

Android 应用程序

- - CSDN博客推荐文章
Android 应用程序由四个模块构造而成:Activity、Intent 、Content Provider 、Service. 下面简单介绍一下如下模块的含义:. 1、Activity  "活动". 一个Activity就是单独的屏幕,每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口并对事件作出响应.

Android 恶意程序 BRATA 能在窃取数据之后抹掉设备所有数据

- - 奇客Solidot–传递最新科技情报
最新版本的 Android 恶意程序 BRATA 能在窃取数据之后将设备恢复到出厂设置,抹掉设备上的所有数据掩盖其活动痕迹. BRATA 在 2019 年最早被发现时属于一种 Android RAT(远程访问工具),主要针对巴西用户. 安全公司 Cleafy 在 2021 年 12 月报告 BRATA 开始在欧洲等地出现,并增加了更多功能,它发展成为窃取电子银行登录凭证的恶意程序.

Android调试程序技巧

- - ITeye博客
在开发的过程中我们经常需要调试程序的执行路径,如我们想知道一个Activity的生命周期方法的调用顺序,我们可能会写如下代码. 这样每次都要输入两个参数,有没有更简便的方法呢. 我们可以通过Thread.currentThread().getStackTrace()获取当前堆栈调用信息,从堆栈信息中可以获取当前调用的java文件名,类名,方法名和代码行号.

Android 程序框架设计

- - 互联网的那点事
每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心. 通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作. 设计模式是在某种特别的情况下,针对某种问题的某种典型、通用的解决方法. 我们是需要适当了解并学习一些设计模式,在程序开发过程中,总是会涉及到一些框架设计,模块设计之类的东西,如果能很好理解并运行设计模式,你所设计的模块或框架将会要稳定得多,因为这些设计模式它们都是通用的解决方案,是经过实践经验了的.

Android 数据持久化

- - CSDN博客推荐文章
在Android中,实现数据持久化主要有四种方式:Preferences,文件I/O,SQLite数据库,ContentProvider组件. 在我们 RUI中上述的几种方法都要涉及,其中LauncherProvider.java文件属于第四种,提供对数据库的一些操作,下面将重点介绍使用ContentProvider来实现数据持久化,其它方法将做简要介绍.

Android--用JSON解析数据

- - CSDN博客移动开发推荐文章
gson-1.7.1.jar,Gson在Android3.0以上才能直接使用,在3.0以下想使用可以从外部导入jar包. 下载链接: http://download.csdn.net/detail/zlqqhs/5075995. 新建工程,新建一个libs文件夹,将gson-1.7.1.jar复制到libs文件夹中.

Eclipse开发Android应用程序入门

- Bingnan - 酷壳 - CoolShell.cn
原文出处:http://www.smashingmagazine.com/2010/10/25/get-started-developing-for-android-with-eclipse/. 如今的移动设备应用程序开发充满着让人振奋的东西. 功能强大的硬件支持,平板电脑,多样的软件平台(塞班 OS,iOS,WebOS,Windows Phone 7…),移动设备开发者前景充满了机会和挑战.

BlueStacks将Android程序运行在Windows上

- nowhere - Solidot
今年初,一家叫BlueStacks的创业公司宣布,将为Windows操作系统开发Android运行时环境,让Android应用程序能运行在Windows上. 现在,该公司发布了其产品BlueStacks Android Player的alpha公测版. 如该公司所承诺的,Windows上运行的Android应用程序的性能没有下降.