一般项目中我们把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. Hexo博客skapp主题部署填坑指南

    相信大家都很喜欢 hexo skapp 的主题,由于作者采用结巴分词,加上需要依赖各种各样的环境 所以可能大家踩过很多坑,也许每个人踩得坑不一样,这里使用 Docker 容器 centos 来部署, ...

  2. 实用的在线预览数据字典的工具(php编写)

    前言 无论是刚接手新项目,或者是维护老项目,有一个方便的数据字典可用是最棒哒! 本文是我为了方便使用数据字典而写的代码. 代码无版权,随便使用. 拷贝代码后,只需修改数据库名,主机,用户名,密码,开箱 ...

  3. openpose关节图

  4. 图解 HTTP 笔记(八)——常见 Web 攻击技术

    本章主要讲解 HTTP 通信过程中的一些常见 Web 攻击技术 一.跨站脚本攻击 跨站脚本攻击(Cross-Site Scripting, XSS)是指通过存在安全漏洞的 Web 网站注册用户的浏览器 ...

  5. expect实现免交互

    如果想写一个能够自动处理输入输出的脚本又不想面对C或Perl,那么expect是最好的选择.它可以用来做一些Linux下无法做到交互的一些命令操作. (1).安装和使用expect expect是不会 ...

  6. MIGO 收货

    ls_code-gm_code = '01'. 01 - MB01 - Goods Receipts for Purchase Order 02 - MB31 - Goods Receipts for ...

  7. linux rz sz替代方案

    SFTP是基于SSH的文件传输协议,与ZMODEM相比具有更加安全且更为快速的文件传输功能. 如何利用SFTP接收文件: 1. 在本地提示以sftp命令登陆拟要接收文件的主机.Xshell:\> ...

  8. Arrange seat of a bench for people

    Given a bench with n seats and few people sitting, tell the seat number each time when a new person ...

  9. php代码调试的重要性

    从去年开始做PHP,基本上有的集成环境用了一个遍,XAMPP,WAMP,phpStudy.都是部署一个环境,就在环境下的默认访问目录去创建项目运行.用PHPStorm一直没能在本地做过什么调试.要么不 ...

  10. [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar在子目录中

    工程创建可参考前文: [学习笔记] 在Eclipse中使用Hibernate,并创建第一个工程,数据库为Oracle XE 在工程上鼠标右键: 找到java 选择 Runable JAR file N ...