我们在做Android应用尤其是商业应用的时候,很多时候都需要后期版本升级,如果我们的数据库文件非常大,比如游戏之类的,这时候就不应该每次版本更新都去重新复制数据库。将数据库和安装包分离,下面来详细介绍:
(1)判断是否是第一次安装
try {
//获取程序的当前版本
PackageInfo info = getPackageManager().getPackageInfo(PACKAGE_NAME, 0);
currentVersion = info.versionCode;
//获取上一个版本
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
lastVersion = prefs.getInt(VERSION_KEY, 0);
System.out.println("当前版本是版本"+currentVersion);
//判断是否是第一次安装
if(currentVersion > lastVersion){
//如果当前版本大于上次版本,说明该版本安装文件属于第一次启动
initDatabase();
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}
(2)如果是第一次安装,则需要判断是否有数据库文件,如果没有则需要复制
private void initDatabase(){
Toast.makeText(this, "不同版本", 2000);
//获取数据库文件要存放的路径
databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
File dir = new File(DATABASE_PATH);
//如果目录不存在,创建这个目录
if(!dir.exists()){
dir.mkdir();
}
//数据库文件是否已存在,不存在则导入
if(!(new File(databaseFilename)).exists()){
StartFrameTask startFrameTask = new StartFrameTask();
startFrameTask.execute();
}else{
System.out.println("数据库已经存在");
}
}
(3)如果还没有数据库文件,则启动异步任务来复制
private void copyDataBase(){
try{
// 获得InputStream对象
InputStream is = getResources().openRawResource(R.raw.cpdata);
pd.setMax(is.available());
FileOutputStream fos = new FileOutputStream(databaseFilename);
byte[] buffer = new byte[1024];
int count = 0;
// 开始复制db文件
int process = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
process += count;
pd.setProgress(process);
}
fos.close();
is.close();
}catch(Exception e){
e.printStackTrace();
}
}
实例代码如下:
package com.example.testsqlite;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.widget.Toast;
public class MainActivity extends Activity {
private static final String PACKAGE_NAME = "com.example.testsqlite";
private static final String VERSION_KEY = "versionCode";
private static final String DATABASE_PATH = "data/data/com.example.testsqlite";
private static final String DATABASE_FILENAME = "cpdata.db";
private int currentVersion;
private int lastVersion;
private ProgressDialog pd;
private String databaseFilename;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
//获取程序的当前版本
PackageInfo info = getPackageManager().getPackageInfo(PACKAGE_NAME, 0);
currentVersion = info.versionCode;
//获取上一个版本
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
lastVersion = prefs.getInt(VERSION_KEY, 0);
System.out.println("当前版本是版本"+currentVersion);
//判断是否是第一次安装
if(currentVersion > lastVersion){
//如果当前版本大于上次版本,说明该版本安装文件属于第一次启动
initDatabase();
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}
}
private void initDatabase(){
Toast.makeText(this, "不同版本", 2000);
//获取数据库文件要存放的路径
databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
File dir = new File(DATABASE_PATH);
//如果目录不存在,创建这个目录
if(!dir.exists()){
dir.mkdir();
}
//数据库文件是否已存在,不存在则导入
if(!(new File(databaseFilename)).exists()){
StartFrameTask startFrameTask = new StartFrameTask();
startFrameTask.execute();
}else{
System.out.println("数据库已经存在");
}
}
private void copyDataBase(){
try{
// 获得InputStream对象
InputStream is = getResources().openRawResource(R.raw.cpdata);
pd.setMax(is.available());
FileOutputStream fos = new FileOutputStream(databaseFilename);
byte[] buffer = new byte[1024];
int count = 0;
// 开始复制db文件
int process = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
process += count;
pd.setProgress(process);
}
fos.close();
is.close();
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 开启进度对话框
*/
private void startProgressDialog() {
if (pd == null) {
pd = new ProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("正在初始化数据库文件");
pd.setCancelable(false);
}
pd.show();
}
/**
* 停止进度对话框
*/
private void stopProgressDialog() {
if (pd != null) {
pd.dismiss();
pd = null;
}
}
/**
* 创建异步任务
*
* @author 李小强
*
*/
public class StartFrameTask extends AsyncTask<Integer, String, Integer> {
/**
* 构造函数
*/
public StartFrameTask() {
}
/**
* 调用取消时
*/
@Override
protected void onCancelled() {
stopProgressDialog();
super.onCancelled();
}
/**
* 后台线程查询数据
*/
@Override
protected Integer doInBackground(Integer... params) {
copyDataBase();
return null;
}
/**
* 该方法将在执行后台耗时操作前被调用
*/
@Override
protected void onPreExecute() {
startProgressDialog();
}
/**
* 将doInBackground()的返回值传给该方法
*/
@Override
protected void onPostExecute(Integer result) {
stopProgressDialog();
}
}
}
目录结构如下:
分享到:
相关推荐
高斯数据库安装包,免安装,解压即可
db2数据库安装包 db2数据库链接服务器驱动 db2数据库安装方法
DM数据库安装包资源文件
MySQL数据库安装包5.7.22
神州通用数据库linux 64位安装包
国产数据库之神通数据库安装包
嵌入式数据库Firbird安装包
hgdb4.5.7-see-centos7-x86-64-20210804.rpm 安装方法可以参考:CentOS上使用rpm安装瀚高数据库(highgo) 地址:https://blog.csdn.net/oDengWei/article/details/119749137
安装在虚拟机linux上,挺好用的 先解压在进入解压缩后的包中,先配置,在make install,然后就ok了
MySQL数据库管理安装包
dm数据库+客户端安装包
android studio 3.2.1 下载 安装包
1.内含详细的安装、卸载、开启、关闭的方法 2.适合Windows系统
mysql是一款经典易学的数据库软件,开发人员必备。数据库软件mysql安装包,win10和win7都有。64位和32位机器都兼容。
64位机,MySQL5.5版本的数据库的安装包,安装亲测没问题
mongo 数据库 mac 安装包, 不需要homebrew,下载就可以
BDESetup(BDE数据库引擎安装包)
如果不安装这个插件,是没法运行程序的。 这也是第一次接触PI数据库,这是个实时数据库,但又类似于时序库。可以查点位的当前快照,也可以查询时间区间内的数据。工业中常用的一款数据库,尤其是电厂。