一般项目中我们把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. Qt编写自定义控件33-图片切换动画

    一.前言 在很多看图软件中,切换图片的时候可以带上动画过渡或者切换效果,显得更人性化,其实主要还是炫一些,比如百叶窗.透明度变化.左下角飞入等,无论多少种效果,核心都是围绕QPainter来进行,将各 ...

  2. python中hashlib模块用法示例

    python中hashlib模块用法示例 我们以前介绍过一篇Python加密的文章:Python 加密的实例详解.今天我们看看python中hashlib模块用法示例,具体如下. hashlib ha ...

  3. iOS-调用网页聊天、拨打电话

    @property (nonatomic,strong) UIButton *but;@property (nonatomic,strong) UIButton *but1;@property (st ...

  4. YUV RGB 格式转换

    第一个公式是RGB转YUV(范围0-255)时用的,第二个公式是用在YUV转换RGB(范围0-255)时用的.1. Y = ; U = -; V = ; 黑色:Y=16 ,U= V =128 红色:Y ...

  5. 最新 迅雷java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.迅雷等10家互联网公司的校招Offer,因为某些自身原因最终选择了迅雷.6.7月主要是做系统复习.项目复盘.LeetCode ...

  6. Spirng 分层,增加数据访问对象层

    到层关键注释 @Repository 对应的包 import org.springframework.stereotype.Repository;

  7. 子组件props接受父组件传递的值,能不能修改的问题

    参考链接:https://www.cnblogs.com/pangchunlei/p/11139356.html

  8. Java向上保留两位小数

    setScale(2, BigDecimal.ROUND_UP) 例如:0.035 运算结果 为0.01

  9. mysql 监听ip地址修改

    如何修改MySQL监听IP地址 Mysql默认在本地环路地址127.0.0.1的3306端口监听,要使用其它IP地址需要修改配置文件. 1.编辑/etc/my.cnf 在[mysqld]节中增加下面一 ...

  10. [CF798D]Mike and distribution_贪心

    Mike and distribution 题目链接:http://codeforces.com/problemset/problem/798/D 数据范围:略. 题解: 太难了吧这个题..... 这 ...