一般项目中我们把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. k8s管理机密信息(9)

    一.启动应用安全信息的保护: Secret介绍: 应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥.将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 ...

  2. Linux下切换用户根目录的指令

    执行 usermod -d /shares/Storage/ ftp 会将用户ftp的根目录(~位置)修改为/shares/Storage/.

  3. 【Fiori系列】为什么SAP Fiori活的如此精致

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[Fiori系列]为什么SAP Fiori活的如 ...

  4. QFramework 使用指南 2020 (四):脚本生成(2)ViewController 与 ViewController 嵌套绑定

    在上一篇,我们学习了,脚本生成的基本使用. 在这一篇,我们试着深入,聊聊脚本生成给我们带来的便利. 脚本生成的便利 首先,我们要知道,在 Unity 的游戏世界中都是以 GameObject 为单位的 ...

  5. YUV RGB 格式转换

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

  6. Django--Form组件使用出现的小bug记录--username拿到None

    form过滤代码: class LoginForm(forms.Form): username = forms.CharField(max_length=20,min_length=3,label=' ...

  7. 前端手势控制图片插件书写二(transform矩阵的原理)

    上次解释了如何使用代码识别双指和单指操作及放大和旋转拖动操作.这次解释下css3的transform原理 一.transform矩阵原理 transform: matrix(a,b,c,d,e,f) ...

  8. ssh出现公钥错误问题的解决方法

      问题:主机app1推送公钥时,公钥判定错误   原因:之前推过公钥,用的是ip而不是主机名(即hosts文件中的对应关系不对),导致app1的~/.ssh/known_hosts中的公钥对不上. ...

  9. Java总复习内容

    StringBuffer定义时需要用正确的方式 例如: StringBuffer xxx = new StringBuffer("雯雯是猪"); 使用StringBuffer的连接 ...

  10. Spring4学习回顾之路09-基于注解的方式配置bean

    一:基于注解配置Bean 首先介绍下组件扫描(component scanning): Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 包括: -@Component ...