1.为什么使用数据库版本控制?
当应用被用户安装后,开发者在新版本功能研发过程过,对数据库的表执行新增、删除、修改后,为了避免在安装新版本的过程中造成新老版本的数据库内容结构的冲突,故而需要通过数据库版本控制来进行数据库内容的升级(onUpgrade)、降级(onDowngrade)操作来规避相关冲突,要达成这些操作,SQLiteOpenHelper.java是不可或缺的一个辅助类。
2.SQLiteOpenHelper.java类
官方API对SQLiteOpenHelper类的具体描述如下:
/**
* A helper class to manage database creation and version management.
* 一个用来管理数据库的创建、版本管理的的辅助类
*
* You create a subclass implementing {@link #onCreate}, {@link #onUpgrade} and
* optionally {@link #onOpen}, and this class takes care of opening the database
* if it exists, creating it if it does not, and upgrading it as necessary.
* 你可以创建一个子类用来实现{@link #onCreate}, {@link #onUpgrade}和
* 可选方法{@link #onOpen},该类负责打开已存在的数据库数据库,
* 创建不存在的数据库和进行必要的升级。
* Transactions are used to make sure the database is always in a sensible state.
* 事务用来确保数据库始终处于一个合理的状态。
* This class makes it easy for {@link android.content.ContentProvider}
* implementations to defer opening and upgrading the database until first use,
* to avoid blocking application startup with long-running database upgrades.
* 这类便于{@link android.content.ContentProvider}在第一次使用之前实现推迟开放和升级数据库,
* 以避免阻塞和长期数据库升级应用程序启动。
* For an example, see the NotePadProvider class in the NotePad sample application,
* in the samples/ directory of the SDK.
*
* Note: this class assumes monotonically increasing version numbers for upgrades.
* 注意:该类假定单调递增的版本号进行升级。
*/
由此可见,SQLiteOpenHelper类是一个用来创建、打开数据库以及进行数据库版本控制的辅助类,它为我们提供了onCreate、onUpgrade、onDowngrade方法分别用来处理数据库的创建、升级、降级操作。
3.如何对数据库进行管理?
在进行具体操作之前,我们要先了解onCreate、onUpgrade、onDowngrade三种方法的使用条件及其作用。
- onCreate(SQLiteDatabase db)
- 使用条件:
1.该方法只有在数据库第一次打开的时候被调用;
2.当用户选择清除数据(数据库文件放在内存中)或选择删除存放在sd卡的外部数据库文件时,会重新调用该方法。 - 作用:
用于创建表等初始化操作。 - 注意:
在数据库升级、不清除数据时,不会触发该方法。 - onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
- 使用条件:
当打开数据库时传入的版本号高于当前版本号时,调用该方法。 - 作用:
用于升级数据库版本。 - 注意:
1.第一次打开数据库时,不会触发该方法;
2.清除数据后重新进入,不会触发该方法。
3.数据库版本号必须为大于等于0的整数,否则会报错。 - onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)
- 使用条件:
当打开数据库时传入的版本号低于当前版本号时,调用该方法。 - 作用:
用于执行对数据库的降级操作。 - 注意:
1.如果不执行降级操作,会抛出异常;
2.数据库版本号必须为大于等于0的整数,否则会报错。
通过对以上方法的使用条件、作用以及注意事项的分析,我们能够很容易的理解对应的方法在什么条件下会被使用,以及在进行对应的数据库管理操作时该在何种方法中进行何种操作。
/**
* 1.该方法只有在数据库第一次打开的时候触发;
* 2.当用户选择清除数据(数据库文件放在内存中)或选择删除存放在sd卡的外部数据库文件时,会重新触发该方法。
*
* 注:
* 在数据库升级、不清除数据时,不会触发该方法。
**/
@Override
public void onCreate(SQLiteDatabase db) {
}
/**
* 1.当数据库已存在且数据库版本升高(新版本的数据库版本号大于旧版本)时,才会触发该方法。
*
* 注:
* 1.第一次打开数据库时,不会触发该方法;
* 2.清除数据后重新进入,不会触发该方法。
**/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
/**
* 1.当数据库版本降级(新版本的数据库版本号小于旧版本)时,会触发该方法。
*
* 注:如果不执行降级操作,会抛出异常。
**/
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
super.onDowngrade(db, oldVersion, newVersion);
}
未完待续...