編輯:關於Android編程
我們在做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();
} 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();
}
}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 {
/**
* 構造函數
*/
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();
}
}
}

[Android開發系列]IT博客應用
1.關於坑 好吧,在此之前先來說一下,之前開的坑,恩,確實是坑,前面開的兩個android開發教程的坑,對不起,實在是沒什麼動力了,不過源碼都有的,大家可以參照githu
Android Studio 打包及引用 aar
Android Studio 打包及引用 aar1、 簡述在比較大的 Android 項目的開發中,我們經常會遇到工程、jar 包等等之間相互引用的方式。一般我們通過在
Android仿即刻首頁垂直滾動圖,炫酷到底!
項目地址:https://github.com/JeasonWong/JikeGallery話不多說,先上效果。這個效果是在即刻app上看到,覺得很不錯,遂仿之。先說下我
Android_LIFE幫(基於最新百度地圖API的開源項目)
越來越多的APP用到了地圖API,所以本人依賴百度地圖提供的API做了一個簡單的項目,希望大家多多支持和star一下!!如果您還沒有去給SoHOT一顆star而直接看這個