一般项目中我们把db文件放到assert或者raw目录下面,在程序第一次启动的时候复制到私有目录下面

在使用过程中,老是发现复制不成功,私有目录下的db文件总是3072

后来发现应该是使用ContentProvider的原因,它会先创建一个空的db。

而我的程序在复制数据库的时候会判断私有目录下是否有数据库文件,如果有则不复制。

现在改为用SharedPreferences一个字段判断是否第一次复制。

第一次复制数据库的时候就算私有目录下有db文件,也删除。

这样就ok了

代码如下:

    1. public class CopyDataActivity extends Activity{
    2. boolean needCopy = false;
    3. SharedPreferences mSP = null;
    4. @Override
    5. protected void onCreate(Bundle savedInstanceState) {
    6. super.onCreate(savedInstanceState);
    7. setContentView(R.layout.copy_data);
    8. mSP = getSharedPreferences(Constants.PREFERENCES_NAME, MODE_PRIVATE);
    9. needCopy = mSP.getBoolean("need_copy_data", true);
    10. if(needCopy){
    11. handler.post(copyPlanThread);
    12. }else{
    13. goToMain();
    14. }
    15. }
    16. private void goToMain(){
    17. mSP.edit().putBoolean("need_copy_data", false).commit();
    18. startActivity(new Intent(CopyDataActivity.this,LoginActivity.class));
    19. this.finish();
    20. }
    21. private Handler handler = new Handler(){
    22. @Override
    23. public void handleMessage(Message msg) {
    24. super.handleMessage(msg);
    25. int what = msg.what;
    26. int arg1 = msg.arg1;
    27. if(what==1){
    28. //这里可以在页面显示复制进度什么的
    29. Log.e("Copy","复制大小:"+arg1);
    30. }else{
    31. goToMain();
    32. mSP.edit().putBoolean("need_copy_data", false).commit();
    33. }
    34. }
    35. };
    36. Runnable copyPlanThread = new Runnable() {
    37. @Override
    38. public void run() {
    39. try{
    40. copyDatabase();
    41. }catch(Exception e){
    42. e.printStackTrace();
    43. }
    44. }
    45. };
    46. private void copyDatabase() throws Exception{
    47. Log.e("Copy","copy start");
    48. File dbfile = new File(getFilesDir().getAbsolutePath() +File.separator+ "mydb.db";
    49. File dir = dbfile.getParentFile();
    50. if(dir.exists() == false){
    51. dir.mkdirs();
    52. }
    53. //把contentprovider生成的db删除
    54. if(dbfile.exists()){
    55. dbfile.delete();
    56. }
    57. InputStream is = this.getResources().openRawResource(R.raw.library);
    58. FileOutputStream fos =  new FileOutputStream( dbfile);
    59. byte[] buffer =new byte[1024];
    60. int size = 0;
    61. int length = 0; //字节
    62. while( (length= is.read(buffer)) > 0){
    63. fos.write(buffer,0,length);
    64. size += length;
    65. Message msg = new Message();
    66. msg.what = 1;
    67. msg.arg1 = size;
    68. handler.sendMessage(msg);
    69. }
    70. fos.flush();
    71. fos.close();
    72. is.close();
    73. Log.e("Copy","copy end");
    74. Message msg = new Message();
    75. msg.what = 0;
    76. msg.arg1 = 0;
    77. handler.sendMessage(msg);
    78. }
    79. }

android程序复制数据库的更多相关文章

  1. 在Android程序中使用已有的SQLite数据库

    已经将这篇文章迁移至 Code问答,你也能够到这里查看这篇文章,请多多关注我的新技术博客CodeWenDa.com 在中文搜索中,没有找到一篇比較好的关于怎样在Android应用中使用自己事先创建好的 ...

  2. IT观察】网络通信、图片显示、数据库操作……Android程序员如何利用开源框架

    每个Android 程序员都不是Android应用开发之路上孤军奋战的一个人,GitHub上浩如烟海的开源框架或类库就是前人为我们发明的轮子,有的轮子能提高软件性能,而有的轮子似乎是以牺牲性能为代价换 ...

  3. 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~

    一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...

  4. Android之SQLite数据库篇

    一.SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大. 二.SQLite的特点 1.轻量级使用 SQLit ...

  5. Android中SQLite数据库小计

    2016-03-16 Android数据库支持 本文节选并翻译<Enterprise Android - Programing Android Database Applications for ...

  6. 【Bugly干货分享】手把手教你逆向分析 Android 程序

    很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的 ...

  7. 使用Visual Studio 2015开发Android 程序

    环境配置: 操作系统:win 7 64位 IDE:Visual Studio 2015 SDK:installer_r24.3.3-windows 安装前提: 编辑hosts文件(在附件可下载)因为安 ...

  8. android程序---->android多线程下载(一)

    多线程下载是加快下载速度的一种方式,通过开启多个线程去执行一个任务,可以使任务的执行速度变快.多线程的任务下载时常都会使用得到断点续传下载,就是我们在一次下载未结束时退出下载,第二次下载时会接着第一次 ...

  9. SQL2005删除复制数据库的发布与订阅的方法(转载)

    SQL2005删除复制数据库的发布与订阅的方法 --在测试环境中恢复从正式数据库服务器 上备份下来的bak文件后,正式环境里数据库复制的发布.订阅也被带进来了,结果恢复的数据库无法更改表结构,直接删除 ...

随机推荐

  1. faster-rcnn 测试自己数据集训练的模型

    python demo_2019051601.pyTraceback (most recent call last): File "demo_2019051601.py", lin ...

  2. Python查询Mysql时返回字典结构的代码

    Python查询Mysql时返回字典结构的代码 MySQLdb默认查询结果都是返回tuple,输出时候不是很方便,必须按照0,1这样读取,无意中在网上找到简单的修改方法,就是传递一个cursors.D ...

  3. SqlDbx连接oracle(可用)

    解压SqlDbx.zip,将SqlDbx放到C:盘根目录 1.Path里面增加:C:\SqlDbx  Path是为了找tnsnames.ora 2.增加系统变量:ORACLE_HOME,路径:C:\S ...

  4. [C++]数据结构:栈之顺序栈

    0 栈的基本概念 栈,根据存储结构的不同,可分为:链栈和顺序栈. 1 顺序栈的知识概览 2 编程复现 2.1 定义基本数据结构 typedef char DataType; // 基本数据类型 enu ...

  5. 1-18-2 LVM管理和ssm存储管理器使用&磁盘配额 (二)

    LVM管理和ssm存储管理器使用&磁盘配额  (二) 内容如下: ü  LVM快照 ü  ssm存储管理器的使用 ü  磁盘配额 第1章 LVM快照 lvm快照:为了保持系统的一致性,我们先做 ...

  6. 集群架构01.Nginx初步安装配置

    1.切换163yum 源,环境介绍 [root@moban ~]# cat /etc/redhat-release CentOS release 6.5 (Final) mv CentOS-Base. ...

  7. sql注入01

    1.SLQ:操作数据 数据库结构 create/drop database create/alter/drop table 数据库内容 insert values语句 insert into tabl ...

  8. 带你手写基于 Spring 的可插拔式 RPC 框架(五)注册中心

    注册中心代码使用 zookeeper 实现,我们通过图片来看看我们注册中心的架构. 首先说明, zookeeper 的实现思路和代码是参考架构探险这本书上的,另外在 github 和我前面配置文件中的 ...

  9. Eclipse配置编写HTML/JS/CSS/JSP页面的自动提示

    我们平时用eclipse开发jsp页面时智能提示效果不太理想,今天用了两个小时发现了eclipse也可以像Visual Studio 2008那样完全智能提示HTML/JS/CSS代码,使用eclip ...

  10. 【转】转载一篇优质的讲解epoll模型的文章

    从事服务端开发,少不了要接触网络编程.Epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,Nginx.Redis.Skynet 和大部分游戏服务器都使用到这一多路复用技术. Epoll ...