• android程序复制数据库


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

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

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


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

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

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

    这样就ok了

    代码如下:

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

  • 相关阅读:
    Ubuntu18.04安装Virtualenv虚拟环境
    SQLite3学习笔记----创建数据库的两种方式
    Git学习笔记-----下载GitHub上某个分支的代码
    Git学习笔记——从一台电脑上传文件到Github上
    plsql配置数据库连接
    Java与各种数据库连接代码
    marquee上下左右循环无缝滚动代码
    仅用aspx文件实现Ajax调用后台cs程序。(实例)
    MVC 5使用TempData(对象)跨视图传递数据
    SQL Server中查询数据库及表的信息语句
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3467410.html
Copyright © 2020-2023  润新知