参考:https://blog.csdn.net/meryvn/article/details/48786495
项目中有时候会涉及到修改数据库表的字段,或者创建数据库表。这时候需要关注数据库升级、降级的方法调用,并做相关处理,否则版本不一致时,会导致数据库不能用,应用出现ANR等异常。
DBHelper类
public class DBHelper extends SQLiteOpenHelper{
static finanl int DATABASE_VERSION_5 = 5;
static finanl String DATABASE_NAME = "zxts.sms.db";
private DBHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION_5);
}
@Override
public void onCreate(SQLiteDatabase db){
//create table
/**
* 这个方法
* 1、在第一次打开数据库的时候才会走
* 2、在清除数据之后再次运行-->打开数据库,这个方法会走
* 3、没有清除数据,不会走这个方法
* 4、数据库升级的时候这个方法不会走
*/
}
@Override
public void onUpdate(SQLiteDatabase db, int oldVersion, int newVersion){
//版本要升级时
/**
* 这个方法
* 1、在第一次打开数据库的时候不会走
* 2、在清除数据之后再次运行,这个方法不会走
* 3、数据库已经存在,而且版本升高的时候,这个方法才会调用
*/
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion){
//版本要降级时,执行降级操作
/**
* 这个方法
* 1、只有新版本比旧版本低的时候才会执行
* 2、如果不执行降级操作,会抛出异常
*/
super.onDowngrade(db, oldVersion, newVersion);
}
}
SQLiteOpenHelper
这是一个辅助类,用来管理数据库的创建和数据库的版本。
你要创建一个这个类的子类来实现onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)方法,以及可选的onOpen(SQLiteDatabase)方法,并且这个类要管理数据库的状态,如果数据库存在,就打开数据库,否则就创建数据库,并且在需要的时候也会更新数据库。使用事务来确保数据库始终在正确的状态中。
这个类让ContentProvider的实现变的容易,它把数据库的打开和升级延迟到第一次使用,从而避免了因升级数据库的长时间运行而造成的应用程序阻塞。
Public构造器
public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CuresorFactory factory, int version)
创建一个辅助对象,用来创建、打开、管理数据库。这个方法始终是快速返回的。在getWriteableDatabase()或getReadableDatabase()方法被调用之前,这个数据库不会实际的被创建。
参数说明:
context:用于打开或创建数据库;
name:指定数据库的文件名,null指定一个内存中的数据库
factory:用于创建游标对象,或默认的null;
version:指定数据库的版本号(从1开始);如果数据库比较旧,onUpgrade(SQLiteDatabase, int, int)方法将用于升级数据库。如果数据库比较新,onDowngrade(SQLiteDatabase, int, int)方法会被用于降级数据库。
public abstract void onCreate(SQLiteDatabase db)
数据库被首次创建时,会调用这个方法。这时创建数据库表和表初始化的地方。
参数:
db:要创建的数据库。
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)
当数据库需要被降级时,调用这个方法。这个方法与onUpgrade(SQLiteDatabase, int, int)方法非常相似,但是它是在当前版本比请求的版本新的时候,才会被调用。但是这个方法不是抽象的,因此它不是强制要求客户实现它的。如果这个方法没有被重写,默认的实现会拒绝降级处理,并抛出SQLiteException异常。
这个方法是在事务中执行的。如果有异常被抛出,所有的改变都会被回滚。
参数:
db:指定要降级的数据库
oldVersion:旧的数据库版本
newVersion:新的数据库版本
public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
当数据库需要升级时,会调用这个方法。应该使用这个方法来实现删除表、添加表或者做一些需要升级新的策略版本的事情。
如果要给表添加一个新列,那么使用使用ALTER TABLE能够把新列插入到表中。如果要重命名或删除列,那么你能够使用ALTER TABLE能够重命名旧表,然后,创建一个新表,并把旧表中内容复制到新表中。
@Override
public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
if(oldVersion < 3){
db.execSQL("CREATE TABLE IF NOT EXISTS addrbook (id interger default 0, name text default '', number text default '');")
oldVersion = 3;
}
if(oldVersion < 5){
db.execSQL("ALTER TABLE gotasettings ADD COLUMN mds_server_ip TEXT DEFAULT '';" );
oldVersion = 5;
}
}
这个方法是事务中执行的,如果有异常被抛出,所有的改变都会被自动的回滚。
参数:
db:指定要降级的数据库
oldVersion:旧的数据库版本
newVersion:新的数据库版本