一定要加上权限,否则不能在sdcard中创建文件 
    <!--在sdcard中创建/删除文件的权限 -->  
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
    <!--往sdcard中写入数据的权限 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在android手机上将应用的数据库备份到sdcard,从sdcard中恢复数据库到应用 
直接调用 restoreDB 进行数据库恢复,调用backupDB进行数据库备份。 
恢复的时候会显示出可以恢复的数据库文件列表

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.text.SimpleDateFormat;
import java.util.Date;
   
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.AsyncTask;
import android.os.Environment;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ProgressBar;
import android.widget.Toast;
   
public class BackupAndRestore {
     private Context mContext = null ;
     private String[] fileList = null ; // 数据库文件列表
     private int choicePostion = - 3 ; // 选择数据库列表中的位置
     private AlertDialog dialog = null ;
     private String BACK_FOLDER = "backup" ;
     private String appName = "myApp" ;
   
     public BackupAndRestore(Context context) {
         mContext = context;
     }
   
     /**
      * 恢复数据的Dialog
      */
     public void restoreDB() {
         fileList = getFileList();
         AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
         builder.setIcon(android.R.drawable.ic_dialog_info);
         builder.setTitle( "恢复" );
         builder.setSingleChoiceItems(getFileList(), - 1 , new DialogClick());
         builder.setPositiveButton( "确定" , new DialogClick());
         builder.setNegativeButton( "取消" , new DialogClick());
         builder.show();
     }
   
     /**
      * 备份数据库
      */
     public void backupDB() {
         showDialog( "是否备份数据库" , 'B' );
     }
   
     /**
      * 显示一个Dialog
      *
      * @param title
      *            标题 ,必须引用资源ID resource ID
      * @param sign
      *            根据标示调用方法 I - 恢复默认设置 D - 恢复默认设置 H -选择主机
      */
     private void showDialog(String title, char sign) {
         final char s = sign;
         new AlertDialog.Builder(mContext).setTitle(title)
                 .setPositiveButton( "确定" , new OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialogI, int which) {
                         switch (s) {
                         case 'B' : // 备份数据库
                             if (dialog == null ) {
                                 dialog = awaitDialog(mContext);
                             } else {
                                 dialog.show();
                             }
                             new ExecuteTask().execute( 'B' );
                             break ;
                         default :
                             break ;
                         }
                     }
                 }).setNegativeButton( "取消" , new OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
                     }
                 }).show();
     }
   
     /**
      * 备份操作
      *
      * @return
      */
     private boolean backUp() {
         boolean isOk = false ;
         String sp = File.separator;
         File sdFile = sdCardOk();
         if (sdFile != null ) {
             try {
                 String[] dbNames = { "数据库名称" };
                 // 创建日期文件夹
                 String folder_date = datePrefix();
                 File f = new File(sdFile.getAbsolutePath() + sp + folder_date);
                 if (!f.exists()) {
                     f.mkdirs();
                 }
                 for ( int i = 0 ; i < dbNames.length; i++) {
                     String dbName = dbNames[i];
                     File dbFile = dbOk(dbName);
                     if (dbFile != null ) {
                         File backFile = new File(f.getAbsolutePath() + sp
                                 + dbFile.getName());
                         backFile.createNewFile();
                         isOk = fileCopy(backFile, dbFile.getAbsoluteFile());
                         if (!isOk) {
                             break ;
                         }
                     }
                 }
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }
         return isOk;
     }
   
     /**
      * 时间前缀
      *
      * @return
      */
     private String datePrefix() {
         SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd-HH-mm-ss" );
         Date date = new Date(System.currentTimeMillis());
         String str = format.format(date);
         return str;
     }
   
     /**
      * 文件夹列表
      *
      * @return
      */
     private String[] getFileList() {
         String[] fileList = null ;
         File file = sdCardOk();
         if (file != null ) {
             File[] list = file.listFiles();
             if (list != null && list.length > 0 ) {
                 fileList = new String[list.length];
                 for ( int i = 0 ; i < list.length; i++) {
                     fileList[i] = list[i].getName();
                 }
             }
         }
         return fileList;
     }
   
     /**
      * sdCard是否存在 备份的文件夹是否存在
      *
      * @return null不能使用
      */
     private File sdCardOk() {
         File bkFile = null ;
         String state = Environment.getExternalStorageState();
         if (Environment.MEDIA_MOUNTED.equals(state)) {
             String sp = File.separator;
             String backUpPath = Environment.getExternalStorageDirectory() + sp
                     + appName + sp + BACK_FOLDER;
             bkFile = new File(backUpPath);
             if (!bkFile.exists()) {
                 bkFile.mkdirs();
             } else
                 return bkFile;
         } else
             Toast.makeText(mContext, "Sdcard 不存在" , Toast.LENGTH_SHORT).show();
         return bkFile;
     }
   
     /**
      * 恢复数据库
      *
      * @param name
      *            选择的文件名称 选中的数据库名称
      * @param resoreDbName
      *            需要恢复的数据库名称
      * @return
      */
     public boolean restore(String name, File f) {
         boolean isOk = false ;
         if (f != null ) {
             File dbFile = dbOk(name);
             try {
                 // System.out.println("覆盖的名称"+dbName);
                 if (dbFile != null ) {
                     isOk = fileCopy(dbFile, f.getAbsoluteFile());
                 } else
                     isOk = false ;
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
         return isOk;
     }
   
     /**
      * 数据库文件是否存在,并可以使用
      *
      * @return
      */
     private File dbOk(String dbName) {
         String sp = File.separator;
         String absPath = Environment.getDataDirectory().getAbsolutePath();
         String pakName = mContext.getPackageName();
         String dbPath = absPath + sp + "data" + sp + pakName + sp + "databases"
                 + sp + dbName;
         File file = new File(dbPath);
         if (file.exists()) {
             return file;
         } else {
             return null ;
         }
     }
   
     /**
      * 等候动画
      */
     public AlertDialog awaitDialog(Context context) {
         ProgressBar bar = new ProgressBar(context);
         bar.setLayoutParams( new LayoutParams(LayoutParams.WRAP_CONTENT,
                 LayoutParams.WRAP_CONTENT));
         AlertDialog dialog = new AlertDialog.Builder(context).create();
         dialog.setCancelable( false );
         dialog.show();
         Window window = dialog.getWindow();
         WindowManager.LayoutParams params = window.getAttributes();
         params.width = 50 ;
         params.height = 50 ;
         window.setAttributes(params);
         window.setContentView(bar);
         return dialog;
     }
   
     /**
      *
      * @param outFile
      *            写入
      * @param inFile
      *            读取
      * @throws FileNotFoundException
      */
     private boolean fileCopy(File outFile, File inFile) throws IOException {
         if (outFile == null || inFile == null ) {
             return false ;
         }
         boolean isOk = true ;
         FileChannel inChannel = new FileInputStream(inFile).getChannel(); // 只读
         FileChannel outChannel = new FileOutputStream(outFile).getChannel(); // 只写
         try {
             long size = inChannel.transferTo( 0 , inChannel.size(), outChannel);
             if (size <= 0 ) {
                 isOk = false ;
             }
         } catch (IOException e) {
             isOk = false ;
             e.printStackTrace();
         } finally {
             if (inChannel != null ) {
                 inChannel.close();
             }
             if (outChannel != null ) {
                 outChannel.close();
             }
         }
         return isOk;
     }
   
     private class DialogClick implements DialogInterface.OnClickListener {
         @Override
         public void onClick(DialogInterface dialog, int which) {
             if (which == - 1 ) { // 确定
                 if (choicePostion < 0 ) {
                     Toast.makeText(mContext, "选择数据库" , Toast.LENGTH_SHORT)
                             .show();
                     return ;
                 }
                 String sp = File.separator;
                 String folderName = fileList[choicePostion];
                 String backUpPath = Environment.getExternalStorageDirectory()
                         + sp + appName + sp + BACK_FOLDER + sp + folderName;
                 File file = new File(backUpPath);
                 if (file.isDirectory()) {
                     File[] files = file.listFiles();
                     boolean isOk = false ;
                     for ( int i = 0 ; i < files.length; i++) {
                         File f = files[i];
                         isOk = restore(f.getName(), f);
                         if (!isOk) {
                             String fail_msg = "恢复失败" + ":" + f.getName();
                             Toast.makeText(mContext, fail_msg,
                                     Toast.LENGTH_SHORT).show();
                             return ;
                         }
                     }
                     if (isOk) {
                         // 如果有数据体现则需要刷新出新的数据
   
                     }
                 }
             } else if (which == - 2 ) { // 取消
             } else if (which >= 0 ) {
                 choicePostion = which;
             }
         }
     }
   
     /**
      * 执行任务
      *
      * @author Administrator
      *
      */
     private class ExecuteTask extends AsyncTask<Character, Void, Boolean> {
         @Override
         protected Boolean doInBackground(Character... params) {
             char c = params[ 0 ];
             if (c == 'B' ) {
                 backUp();
             }
             return null ;
         }
   
         @Override
         protected void onPostExecute(Boolean result) {
             super .onPostExecute(result);
             if (dialog != null ) {
                 dialog.dismiss();
             }
         }
     }
}

Android数据库备份和恢复相关推荐

  1. ASP中怎么实现SQL数据库备份、恢复!

    选择自 hanghwp 的 Blog 1.ASP中怎么实现SQL数据库备份.恢复! 答:asp在线备份sql server数据库: 1.备份 <% SQL="backup databa ...

  2. mysql 恢复数据库 source_mysql数据库备份及恢复命令 mysqldump,source的用法 | 很文博客...

    mysql数据库备份及恢复命令 mysqldump,source的用法,需要的朋友可以参考下. 还原一个数据库:mysql -h localhost -u root -p123456 www d:\w ...

  3. java写的MySQL数据库备份和恢复代码:

    1.MySQL数据库备份和恢复,java代码实现:详情见下面: package com.spring.util; import java.io.BufferedReader; import java. ...

  4. Sql Server数据库备份和恢复:原理篇

    本文与您探讨为什么Sql Server有完整备份.差异备份和事务日志备份三种备份方式,以及为什么数据库又有简单模式.完整模式和大容量日志模式这三种恢复模式.本文内容适用于2005以上所有版本的Sql ...

  5. Oracle数据库备份和恢复配置详解

    本文Oracle讲述了数据库备份和恢复配置的详解过程,可能的失败及其解决方法. 失败类型 遇到的失败或错误分为两大类:物理和逻辑.物理错误一般是硬件错误或使用数据库的应用程序中的软件错误,而逻辑错误一 ...

  6. 案例:Oracle dul数据挖掘 没有数据库备份非常规恢复truncate删除的数据表

    Oracle数据库在没有备份情况下在对表中的某数据表进行truncate删除后,通过oracle dul进行非常规恢复 1.准备oracle dul测试环境 SQL> select count( ...

  7. linux postgresql 恢复数据库,PostgreSQL数据库备份和恢复

    一.备份 1.cmd到PostgreSQL安装目录bin下 2.备份命令 pg_dump -h 192.168.100.23 -U postgres postgres > D:\postgres ...

  8. oracle dul误删数据,案例:Oracle dul数据挖掘 没有数据库备份非常规恢复truncate删除的数据表...

    Oracle数据库在没有备份情况下在对表中的某数据表进行truncate删除后,通过oracle dul进行非常规恢复 1.准备oracle dul测试环境SQL> select count(* ...

  9. MS SQL数据库备份和恢复

    数据库备份和恢复存储过程(和大家交流一下) if exists( select * from sysobjects where name = ' pr_backup_db ' and xtype = ...

最新文章

  1. 多传感器融合:自动驾驶(下)
  2. 011_fastdfs-client-java模块
  3. Java 使用 endorsed 覆盖jdk提供的类
  4. mac镜像cdr格式_eps是什么格式怎么打开?全面解析图片的eps是什么格式
  5. object怎么转list_PaddleOCR识别模型转Pytorch全流程记录
  6. mysql+enable+sql+log_MySQL -- redolog + binlog
  7. Twaver-HTML5基础学习(38)劈分面板SplitPane
  8. 视频字幕制作软件:iSubtitle for mac中文版
  9. 人才管理是什么意思_什么是iTM?人才管理iTM是什么意思?
  10. pageadmin CMS网站制作教程
  11. 【R语言】沈阳地铁数据处理及站间流量统计——R语言第五次实训
  12. Linux-Shell脚本练习
  13. JetSon-nano板卡_从sd卡烧录到tensorRT部署_一条龙
  14. 【华人学者风采】查正军 中国科学技术大学
  15. c语言struct结构体类型有关typedef定义的本名和别名
  16. 阿里巴巴使用Java技术干嘛_阿里巴巴java技术岗三面分享
  17. 软件通用自动更新系统
  18. 华为进入公有云的为与不为
  19. 天文竞赛怎么用计算机,天文仪器和方法
  20. git push 失败,提示 unpack error/unpack failed 解决方法

热门文章

  1. ios 左右滑动手势
  2. 【强化学习】分层强化学习
  3. 全面接入:ChatGPT杀进10个商业应用,让AI替你打工
  4. 关于程序员入职一家公司需要问咨询的一些的问题(面试总结)
  5. 用严密的数学语言证明:周长相同时,圆面积最大
  6. 著名歌唱家大衣哥太豪横了,参加商演被主办方请到五星级酒店就餐
  7. Python语法基础 三
  8. 原来勾股定理可以这样证!
  9. PHP 返回结果给前端/ajax后,在后台继续执行代码的方法
  10. android手机运行win10,Win10可以直接运行你手机里的安卓APP了:三星率先支持