Android中通过导入静态数据库来提高应用第一次的启动速度

一个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工具类时,不能再传递数据库的名称作为参数,而是要把数据库文件的全 路经传递给它们。

时间: 2024-10-29 05:16:11

Android中通过导入静态数据库来提高应用第一次的启动速度的相关文章

在Android中通过导入静态数据库来提高应用第一次的启动速度

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

Android中个人推崇的数据库使用方式

手机应用开发中经常会使用到数据库存储一些资料或者进行数据缓存,android中为我们提供了一个轻量的数据库,在上层进行了一层封装,同时还为我们提供了ContentProvider的框架,方便我们进行数据操作,以及在不同的程序之间进行数据共享.本文介绍一下,我在使用数据库的一些我认为比较好的习惯,欢迎与我讨论. 关于框架 通常网络操作,Json解析,我都会使用框架,这样可以很好的帮助我处理异常,处理异步操作.但是数据库操作我则使用自带的SQLiteHelper和ContentProvider,这样

C#将SQL数据库中数据导入Excel中,并将Excel中反导入SQL数据库中

实际的开发中,我们会经常遇到数据的转化的需要,将Excel中的数据转入到SQL中,或将SQL在数据库表中的数据导入到Excel中.代码如下: Code using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windo

android中少用静态变量(android静态变量static生命周期)

在android中,要少用静态变量. 我现在做的一个应用中,之前的开发人员使用静态变量来存储cookie,这个全局的静态变量用来验证身份. 这时客户反应,应用长时间不使用,再次使用,会提示身份过期. 后来经查,问题基本确定在静态变量上. 上stackoverflow查了android中static变量的生命周期,有人这么说 Lifetime of a static variable: A static variable comes into existence when a class is l

Android中最方便的数据库--LitePal

最近看到了郭神分析的LitePal框架,感觉很强大,试用了一下,确实不错,你习不习惯我不知道,因人而异嘛,感觉很适合我 看完之后,想了想,对我来说吧,实体来个set赋值,要是数据很多的话那可麻烦大了,更何况我现在工作内容基本上都是跟服务器交互,数据吗,就不用说了...一般都是json传送数据,直接用Gson解析,扔到list里面就不管了,所以我这里需要把list内容保存,于是乎,我就下载了源码,看了看,确实很强大,我要的内容都有,并且还很方便 废话少说,先呈上LItePal的源码地址:https

android中正确导入第三方jar包

正确的方法如下: 1,右键工程,     Build path,    java build path, 2,选择libraries在右边的按钮中点击“Add Library” 3,选择“User library”,点击“下一步” 4,点击“User librarys”按钮在出现的界面中点击“New..”按钮 在弹出的界面中随便起一个名字,点击“确定” 5,点击“Add jars”按钮选择第三方jar包, 点击“确定”完成操作.这样的话该jar包会被一起打包到apk中,问题也就解决了!

Django中关于导入静态文件的方法

1.首先需要设置static文件的位置,在setting文件中设置 2.在html中通过{% load staticfiles %}加载,并调用,如下 原文地址:https://www.cnblogs.com/wangyi891224/p/9047479.html

android中的category静态值(转)

提供将要执行的action的额外信息,一般在隐式地启动activity时需要用到.常见的category如下 CATEGORY_ALTERNATIVE 设置这个activity是否可以被认为是用户正在浏览的数据的一个可选择的action CATEGORY_APP_BROWSER 和ACTION_MAIN一起使用,用来启动浏览器应用程序 CATEGORY_APP_CALCULATOR 和ACTION_MAIN一起使用,用来启动计算器应用程序 CATEGORY_APP_CALENDAR 和ACTIO

Android中Sqlite数据库多线程并发问题

最近在做一个Android项目, 为了改善用户体验,把原先必须让用户"等待"的过程改成在新线程中异步执行.但是这样做遇到了多个线程同时需要写Sqlite数据库,导致操作数据库失败. 本人对Java并不熟悉,只接触了2个多月(纯粹为了Android项目, 才开始接触JAVA), 在网上搜了一下, 发现JAVA在线程同步方面提供的功能相对于C#真少,只找到synchronized关键字, 而且还不提供timeout机制, 不过经过测试, 至少解决了目前的需求. 问题需求: 1. Andro