android程序复制数据库
一般项目中我们把db文件放到assert或者raw目录下面,在程序第一次启动的时候复制到私有目录下面
在使用过程中,老是发现复制不成功,私有目录下的db文件总是3072
后来发现应该是使用ContentProvider的原因,它会先创建一个空的db。

而我的程序在复制数据库的时候会判断私有目录下是否有数据库文件,如果有则不复制。
现在改为用SharedPreferences一个字段判断是否第一次复制。
第一次复制数据库的时候就算私有目录下有db文件,也删除。
这样就ok了
代码如下:
- public class CopyDataActivity extends Activity{
- boolean needCopy = false;
- SharedPreferences mSP = null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.copy_data);
- mSP = getSharedPreferences(Constants.PREFERENCES_NAME, MODE_PRIVATE);
- needCopy = mSP.getBoolean("need_copy_data", true);
- if(needCopy){
- handler.post(copyPlanThread);
- }else{
- goToMain();
- }
- }
- private void goToMain(){
- mSP.edit().putBoolean("need_copy_data", false).commit();
- startActivity(new Intent(CopyDataActivity.this,LoginActivity.class));
- this.finish();
- }
- private Handler handler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- int what = msg.what;
- int arg1 = msg.arg1;
- if(what==1){
- //这里可以在页面显示复制进度什么的
- Log.e("Copy","复制大小:"+arg1);
- }else{
- goToMain();
- mSP.edit().putBoolean("need_copy_data", false).commit();
- }
- }
- };
- Runnable copyPlanThread = new Runnable() {
- @Override
- public void run() {
- try{
- copyDatabase();
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- };
- private void copyDatabase() throws Exception{
- Log.e("Copy","copy start");
- File dbfile = new File(getFilesDir().getAbsolutePath() +File.separator+ "mydb.db";
- File dir = dbfile.getParentFile();
- if(dir.exists() == false){
- dir.mkdirs();
- }
- //把contentprovider生成的db删除
- if(dbfile.exists()){
- dbfile.delete();
- }
- InputStream is = this.getResources().openRawResource(R.raw.library);
- FileOutputStream fos = new FileOutputStream( dbfile);
- byte[] buffer =new byte[1024];
- int size = 0;
- int length = 0; //字节
- while( (length= is.read(buffer)) > 0){
- fos.write(buffer,0,length);
- size += length;
- Message msg = new Message();
- msg.what = 1;
- msg.arg1 = size;
- handler.sendMessage(msg);
- }
- fos.flush();
- fos.close();
- is.close();
- Log.e("Copy","copy end");
- Message msg = new Message();
- msg.what = 0;
- msg.arg1 = 0;
- handler.sendMessage(msg);
- }
- }
android程序复制数据库的更多相关文章
- 在Android程序中使用已有的SQLite数据库
已经将这篇文章迁移至 Code问答,你也能够到这里查看这篇文章,请多多关注我的新技术博客CodeWenDa.com 在中文搜索中,没有找到一篇比較好的关于怎样在Android应用中使用自己事先创建好的 ...
- IT观察】网络通信、图片显示、数据库操作……Android程序员如何利用开源框架
每个Android 程序员都不是Android应用开发之路上孤军奋战的一个人,GitHub上浩如烟海的开源框架或类库就是前人为我们发明的轮子,有的轮子能提高软件性能,而有的轮子似乎是以牺牲性能为代价换 ...
- 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~
一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...
- Android之SQLite数据库篇
一.SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大. 二.SQLite的特点 1.轻量级使用 SQLit ...
- Android中SQLite数据库小计
2016-03-16 Android数据库支持 本文节选并翻译<Enterprise Android - Programing Android Database Applications for ...
- 【Bugly干货分享】手把手教你逆向分析 Android 程序
很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的 ...
- 使用Visual Studio 2015开发Android 程序
环境配置: 操作系统:win 7 64位 IDE:Visual Studio 2015 SDK:installer_r24.3.3-windows 安装前提: 编辑hosts文件(在附件可下载)因为安 ...
- android程序---->android多线程下载(一)
多线程下载是加快下载速度的一种方式,通过开启多个线程去执行一个任务,可以使任务的执行速度变快.多线程的任务下载时常都会使用得到断点续传下载,就是我们在一次下载未结束时退出下载,第二次下载时会接着第一次 ...
- SQL2005删除复制数据库的发布与订阅的方法(转载)
SQL2005删除复制数据库的发布与订阅的方法 --在测试环境中恢复从正式数据库服务器 上备份下来的bak文件后,正式环境里数据库复制的发布.订阅也被带进来了,结果恢复的数据库无法更改表结构,直接删除 ...
随机推荐
- Jenkins 搭建企业实战案例 (发布与回滚)
让我们的代码部署变得easy,不再难,Jenkins是一个可扩展的持续集成引擎,是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.Jenkins非常易于安装和配置,简单易用 ...
- Java静态方法和实例方法区别详解
静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方 ...
- Druid Monitor监控Java Web和Java SE项目
Druid Monitor 对于数据源,大家已经接触了不少了.比如c3p0.dhcp.proxool等,之后又发现使用tomcat-jdbc可以大大的提高性能.但是针对于我们的高并发的系统来说,总希望 ...
- PAT 甲级 1012 The Best Rank (25 分)(结构体排序)
题意: 为了评估我们第一年的CS专业学生的表现,我们只考虑他们的三个课程的成绩:C - C编程语言,M - 数学(微积分或线性代数)和E - 英语.同时,我们鼓励学生强调自己的最优秀队伍 - 也就是说 ...
- kubernetes之StatefulSet部署zk和kafka
前提 至少需要三个node节点,否则修改亲和性配置 如果外部访问,需要自己暴露 需要有个storageClass,这样做的原因是避免手动创建pv了 部署zk和kafka 参考: https://www ...
- 修改ssh端口
centos7.5修改默认SSH端口 linux SSH默认端口是22,不修改的话存在一定的风险,要么是被人恶意扫描,要么会被人破解或者攻击,所以我们需要修改默认的SSH端口 1.修改22端口为620 ...
- 删除Vue中无权限的【node_modules】文件
npm install rimraf -g rimraf node_modules
- 数字麦克风PDM信号采集与STM32 I2S接口应用--笔记目录
数字麦克风采用MEMS技术,将声波信号转换为数字采样信号,由单芯片实现采样量化编码,一般而言数字麦克风的输出有PDM麦克风和PCM麦克风,由于PDM麦克风结构.工艺简单而大量应用,在使用中要注意这二者 ...
- docker安装mongodb和redis
一.安装mongodb docker pull mongo docker run -p 27017:27017 -d --name mongodb01 mongo docker run -p 2701 ...
- JS获取URL地址
var url = window.location.href;