一般项目中我们把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. C# 去除所有的html标签

    /// <summary> /// 去除所有的html标签 /// </summary> /// <param name="strhtml">& ...

  2. Android检测服务是否运行

    直接上代码: /** * 判断服务是否后台运行 * * @param context * Context * @param className * 判断的服务名字 * @return true 在运行 ...

  3. pip install staty

    ERROR: Complete output from command python setup.py egg_info:ERROR: Traceback (most recent call last ...

  4. Java HttpClient Post请求参数格式为XML

    1.最近忙着做一个接口,拿到文档的时候,what?我当时就震惊了,全都是XML数据传输. 我当时就懵了,哎没得办法,在暑假传输这方面笔者比较熟练json格式数据,简单易懂啊 那就学呗. 2.我在使用的 ...

  5. sed例子

    以care.log这个log文件为例, care.log: 05:44:31,816 DEBUG RawAggregationWorker:70 - LTS is working on Raw Dat ...

  6. 终端复用器tmux基础使用

    简介对于经常操作Linux系统的同学来说,远程连接Linux服务器使用最多的工具是SecureCRT或者Xshell,而将此时的环境称为终端环境.Tmux是两个单词的缩写,即“Terminal Mul ...

  7. 攻防世界CRYPTO新手练习

    0x01 base64 直接base64 Decode 得到flag cyberpeace{Welcome_to_new_World!} 0x02 Caesar key为12 的恺撒密码,解密德fla ...

  8. ss user-rule自定义规则并硬连接到OneDrive进行自动同步

    最近又换回Edge没了Switchy Omega用,仅仅使用GFWList感觉不够用,一些境内没服务器的网站直连还是挺慢的,于是就研究了一下PAC自定义规则. 简单说,平时用的规则就只有三种: 对于没 ...

  9. c++ hex string array 转换 串口常用

    c++ hex string array 转换 效果如下 tset string is follow 0x50 55 0x35 00 10 203040506073031323334ff format ...

  10. Linux系统下GDB调试

    GDB 一.gdb常用命令: 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 in ...