Android数据库升级

Android数据库的升级不同于Android应用程序的升级,数据库升级在升级应用程序时想要修改数据表结构时发生。在探索Android数据库SQLite的升级前我们得弄清楚SQLite数据库的使用方法,包括但不限于创建、修改。


创建

使用Android的SQLite时,我们会自定义类(例如类名就叫DBOpenHelper)继承自SQLiteOpenHelper,在DBOpenHelper的构造方法中:

public DBOpenHelper(Context context, String name, CursorFactory factory, int version) {
		super(context, name, factory, version);
}

其中version为数据库的版本号,也就是在创建DBOpenHelper对象时指定:

DBOpenHelper openHelper = new DBOpenHelper(getApplicationContext(), "mydata.db", null, version);

而上面的调用DBOpenHelper方法并没有创建数据库,也就是没有创建mydata.db文件。在调用getReadableDatabase或getWritableDatabase方法时:

SQLiteDatabase db = openHelper.getWritableDatabase();

才会判断指定的数据库是否存在,不存在则调用SQLiteDatabase的onCreate方法创建,若存在则不会执行onCreate方法。同时在目录data/data/包名/databases/目录下生成mydata.db文件, onCreate只在数据库第一次创建时才会执行。


更新

在需要更新数据库版本时,比如在应用程序的新版本代码中修改了version数值(这里不是AndroidManifest.xml文件里的version,而是上文说的创建DBOpenHelper对象时传入的version参数)为高版本,并升级应用程序时,当构建DBOpenHelper对象时如果程序发现版本号比原先的版本高,就会自动调用onUpgrade方法,你对数据库进行升级的代码就会被执行。如果比已存在数据库的版本低,那么就会抛出android.database.sqlite.SQLiteException: Can't downgrade from xxx to xxx异常。

注:在一个应用程序中,可能多个地方会用到SQLiteOpenHelper的实例化对象,例如针对数据库的自定义ContentProvider中进行数据库相关的查询、更新操作,就需要注意应用程序中数据库的版本号一致,比较好的解决办法就是用一个类统一管理数据库的属性信息。

数据库的更新有几种情况:删除原来数据库、增加表删除表、对已存在的表增加字段或者修改字段。第三个相对复杂些,我们来说说方法。
SQLite数据库的ALTER TABLE命令使我们直接对已存在表的字段增加提供可能,但是唯一不足的是只能在表末尾添加列:
ALTER TABLE  my_table_name  ADD COLUMN  new_column_name  char(1)

如果想要更复杂的操作,方法之一就是创建一个新表,将已有表的数据插入到新表里:
1.ALTER命令将旧表重命名;
2.CREATE创建新表;
3.INSERT INTO将旧表数据插入新表,同时添加新列或修改信息;
4.删除临时表。
db.execSQL方法执行下面语句:
ALTER TABLE my_table_name RENAME  TO  my_table_name_temp;
CREATE TABLE my_table_name(
   	column1 datatype  PRIMARY  KEY(one or more columns)),
        column2 datatype,
	......
        columnN datatype
	columnN+1 datatype);
INSERT INTO my_table_name(column1,column2,......,columnN,columnN+1)  SELECT column1,column2,......,columnN,插入列的默认值  FROM  my_table_name_temp;
DROP TABLE my_table_name_temp;

跨版本数据库升级问题

跨版本数据库升级时,有两种方法:
1.一级一级迭代升级,当跨越的版本较多时需要很多升级时间;
2.针对每个版本升级到最新版本写不同的升级方式,需要对每个旧版本的数据库结构很清晰。
总之都有利有弊,根据实际情况结合两种方法使用才是最佳选择。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值