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提高篇
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!