博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android中通过导入静态数据库来提高应用第一次的启动速度
阅读量:6374 次
发布时间:2019-06-23

本文共 1630 字,大约阅读时间需要 5 分钟。

 一个Android应用给用户的第一印象非常重要,除了要有好的创意和美观的界面,性能也是很关键的部分,本文讨论的就是第一次启动的速度问题。 Android应用的启动过程不能让用户等待太长时间,个人觉得最好控制在3秒之内。一般来说,内容的初始化是影响Android应用第一次启动速度的主要因素之一,尤其是创建数据库并插入一定数量的初始记录,对于这种问题,最好的办法莫过于在首次初始化时导入静态数据库。

  在Android中导入静态数据库很简单,首先将准备好的静态数据库文件放到Android工程的res目录中的raw子目录下面,如果没有这个子目录的话就手动创建该目录,然后在应用的初始化阶段通过类似下面的代码将数据库文件拷贝到特定的目录下面,假设Android应用的包名是com.test,那么大部分情况下该应用默认的数据库文件位于/data/data/com.test/databases目录下面。

 

String dbDirPath = "/data/data/com.test/databases";  File dbDir = new File(dbDirPath);  if(!dbDir.exists()) // 如果不存在该目录则创建     dbDir.mkdir();  // 打开静态数据库文件的输入流  InputStream is = context.getResources().openRawResource(R.raw.data);  // 打开目标数据库文件的输出流  FileOutputStream os = new FileOutputStream(dbDirPath+"/data.db");  byte[] buffer = new byte[1024];  int count = 0;  // 将静态数据库文件拷贝到目的地  while ((count = is.read(buffer)) > 0) {    os.write(buffer, 0, count);  }  is.close();  os.close();

 

以最近完成的一个应用来看,采用导入静态数据库的方式后,第一次启动时间从将近4秒变成了1秒,效果还是很明显的。  

  不过,这种方式是假定所有Android设备的应用安装目录是相同的,而且数据库文件的目录都是/data/data/包名/databases,但是Android的文档中并没有明确规定所有设备具有此种目录结构,所以将静态数据库文件拷贝到一个事先定死的目录的做法还是有一定危险性的。更好的做法是使用Android系统提供的API去解决这个问题,总之,我们要避免的就是使用固定目录,下面是更好的拷贝过程:

 

// 打开静态数据库文件的输入流  InputStream is = context.getResources().openRawResource(R.raw.data);  // 通过Context类来打开目标数据库文件的输出流,这样可以避免将路径写死。  FileOutputStream os = context.openFileInput("data.db");  byte[] buffer = new byte[1024];  int count = 0;  // 将静态数据库文件拷贝到目的地  while ((count = is.read(buffer)) > 0) {    os.write(buffer, 0, count);  }  is.close();  os.close();

 

最终的数据库文件将位于/data/data/com.data/files目录下,需要注意的是,使用Context类的 openOrCreateDatabase方法或者SQLiteOpenHelper工具类时,不能再传递数据库的名称作为参数,而是要把数据库文件的全 路经传递给它们。

 

转载地址:http://nljqa.baihongyu.com/

你可能感兴趣的文章
设置类UIColor使用colorWithRed定义颜色
查看>>
C#数据库访问技术之DATAREADER对象读取数据
查看>>
各种排序方法
查看>>
编译时程序透彻理解异常并合理使用异常
查看>>
控件服务器端服务器控件与客户端控件
查看>>
2013年5月18日星期六
查看>>
优化网站设计(三十):优化CSS sprites
查看>>
js 字符串操作函数集合
查看>>
悟透JavaScript
查看>>
nullnullCF 312B(Archer-等比数列极限求和)
查看>>
消息函数windows 程序设计 第三章 (下)
查看>>
java中调用web中的jsp或servlet去通知它们做一些操作
查看>>
Javascript 坦克大战
查看>>
JavaScript自动设置IFrame高度(兼容各主流浏览器)
查看>>
Linux内核中__init, __initdata, __initfunc(), asmlinkage, ENTRY(), FASTCALL()等作用
查看>>
leetcode -- Two Sum
查看>>
Windows多线程
查看>>
Resolve PSExec "Access is denied"
查看>>
C语言局部变量和全局变量问题汇总
查看>>
android 下的网络图片加载
查看>>