在Android中afinal框架下實現sqlite數據庫版本升級的辦法

public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version) 這個方法在實現時需要重寫。

public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version)

這個方法在實現時需要重寫。

onUpgrade方法會在數據庫需要升級的時候調用。可以用來增刪表或者其他任何操作。如果你想添加新的列你可以使用ALTER TABLE 插入表中。如果需要重命名或者刪掉列,可以使用ALTER TABLE 重命名舊表,然後創建新的表,並將舊表數據添加到新表中。如果拋出異常,將自動回滾。

1. 幫助文檔裏說的“數據庫升級”是指什麼?

你開發了一個程序,當前是1.0版本。該程序用到了數據庫。到1.1版本時,你在數據庫的某個表中增加了一個字段。那麼軟件1.0版本用的數據庫在軟件1.1版本就要被升級了。

2. 數據庫升級應該注意什麼?

軟件的1.0版本升級到1.1版本時,老的數據不能丟。那麼在1.1版本的程序中就要有地方能夠檢測出來新的軟件版本與老的數據庫不兼容,並且能夠有辦法把1.0軟件的數據庫升級到1.1軟件能夠使用的數據庫。換句話說,要在1.0軟件的數據庫的那個表中增加那個字段,並賦予這個字段默認值。

3. 程序如何知道數據庫需要升級?

SQLiteOpenHelper類的構造函數有一個参數是int version,它的意思就是指數據庫版本號。比如在軟件1.0版本中,我們使用SQLiteOpenHelper訪問數據庫時,該参數为1,那麼數據庫版本號1就會寫在我們的數據庫中。

到了1.1版本,我們的數據庫需要發生變化,那麼我們1.1版本的程序中就要使用一個大於1的整數來構造SQLiteOpenHelper類,用於訪問新的數據庫,比如2。

當我們的1.1新程序讀取1.0版本的老數據庫時,就發現老數據庫裏存儲的數據庫版本是1,而我們新程序訪問它時填的版本號为2,系統就知道數據庫需要升級。

4. 何時觸發數據庫升級?如何升級?

當系統在構造SQLiteOpenHelper類的對象時,如果發現版本號不一样,就會自動調用onUpgrade函數,讓你在這裏對數據庫進行升級。根據上述場景,在這個函數中把老版本數據庫的相應表中增加字段,並给每條記錄增加默認值即可。

新版本號和老版本號都會作为onUpgrade函數的参數傳進來,便於開發者知道數據庫應該從哪個版本升級到哪個版本。

升級完成後,數據庫會自動存儲最新的版本號为當前數據庫版本號。

-----------------------------------------------------------------------------------------------------------------

上面采用的是SQLiteOpenHelper中的onUpgrade方法實現數據庫的升級。

首先獲取Context:

private Context  mContext=this;

然後實現FinalDb內的靜態方法:

FinalDb.create(mContext,"afinal.db",true,2,this);

實現FinalDb的DbUpdateListener接口中的方法:

@Override
	public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {

		// TODO Auto-generated method stub
		try {
			InputStream in = mContext.getAssets().open("patch.sql");
			BufferedReader bufferedReader = new BufferedReader(
					new InputStreamReader(in));
			String sqlUpdate = null;
			while ((sqlUpdate = bufferedReader.readLine()) != null) {
				if (!TextUtils.isEmpty(sqlUpdate)) {
					db.execSQL(sqlUpdate);
				}
			}
			bufferedReader.close();
			in.close();
		} catch (SQLException e) {
			System.out.println(e.toString());
		} catch (IOException e) {
			System.out.println(e.toString());
		}
	}

時間緊迫,沒有寫太多,大家可以自己研究。

时间: 2024-08-08 16:23:02

在Android中afinal框架下實現sqlite數據庫版本升級的辦法的相关文章

[转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

一.前言 关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还有一个框架是CydiaSubstrate,但是这个框架是收费的,而且个人觉得不怎么好用,而Xposed框架是免费的而且还是开源的,网上也有很多文章介绍了Xposed框架的原理实现,不了解的同学可以自行查阅即可,本文主要介绍如何通过这个框架来进行系统方法的拦截功能,比如我们开发过程中,对于一些测试环境很难模拟,特别是测试同学有时候像随机改变设备的imei,mcc等信息用来模拟不同测试场景,这时候

android中libs目录下armeabi和armeabi-v7a的区别

在我们android APK的根目录有一个 libs文件夹,此文件夹下包含了armeabi 和armeabi-v7a两个文件夹,我们的c代码编译成的本地库(各种.so)就会放在这两个文件夹其中的一个.那armeabi-v7a 与 armeabi有什么区别,都是什么意思呢? armeabi和armeabi-v7a是表示cpu的类型,我们知道一般的手机或平板都是用arm的cpu(mips的就悲催的被忽视了),不同的cpu的特性不一样,armeabi就是针对普通的或旧的arm cpu,armeabi-

Android中ButterKnife框架

Android中ButterKnife框架 前言:发现一个不错的注入框架,为了偷懒,还是拿来用了,其实我不是一个喜欢偷懒的码农,但 - - Introduction Annotate fields with @Bind and a view ID for Butter Knife to find and automatically cast the corresponding view in your layout. class ExampleActivity extends Activity

关于linux input device输入子系统架构及android中的框架

关于linux input device输入子系统架构及android中的框架 应用app和windowmanagerservice的input event通信方式 在Native层的InputChannel就是一个通道,仅仅是一个通道,仅仅具有通信功能,不包含其他的.至于从数据流动方向,与InputChannel无关.数据流向是由InputPublisher和InputConsumer在组合了InputChannel后决定的.把InputChannel由应用程序传递到WindowManageS

Android中网络框架的简单封装

个人博客 http://www.milovetingting.cn Android中网络框架的简单封装 前言 Android作为一款主要应用在移动终端的操作系统,访问网络是必不可少的功能.访问网络,最基本的接口有:HttpUrlConnection,HttpClient,而在后续的发展中,出现了Volley,OkHttp,Retrofit等网络封装库.由于各种原因,在实际的项目开发中,我们可能会需要在项目的版本迭代中,切换网络框架.如果对于网络框架没有好的封装,那么当需要切换网络框架时,可能就会

使用Android中API建议的方式实现SQLite数据库的增、删、改、查的操作

package com.examp.use_SQLite.dao; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.examp

Android中API建议的方式实现SQLite数据库的增、删、改、查的操作

package com.examp.use_SQLite.dao; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.examp

Android中Xposed框架篇---修改系统位置信息实现自身隐藏功能

一.前言 前文已经介绍了Xposed框架的基本使用规则,本文主要来介绍一个实际案例就是如何通过这个框架来修改系统的地理位置信息来实现隐藏功能,在如今社交工具的发展特别是微信,他有一个实时位置共享功能,那么对于那些不是单身狗的同学来说可能会有些蛋疼,哪天媳妇要查岗发送位置,结果你不在她期望的位置这时候就尴尬了,而且朋友圈在分享内容的时候可以选择当前位置,有的屌丝就像我一样没钱但是又想到处旅游,那么这时候咋们就可以一本正经的装个逼了. 二.定位原理 看到上面说的那么多,感觉这个功能必须要搞起来了,好

Android中Xposed框架篇---基于Xposed的一款脱壳神器ZjDroid工具原理解析

一.前言 在前文中我们介绍了如何使用Xposed框架修改地理位置信息来进行自身的隐藏功能,本文将继续介绍Xposed框架的另外一个功能就是实现应用的简单脱壳,其实说是Xposed的作用其实也不是,主要是模块编写的好就可以了,主要是利用Xposed的牛逼Hook技术实现的,下面就先来介绍一下这个脱壳模块工具ZjDroid的原理,因为他是开源的,所以咋们直接分析源码即可,源码的下载地址:https://github.com/halfkiss/ZjDroid 不过可惜的时候他只公开了Java层的代码,