Android原生数据库的升级更新OnUpgrade

最近从Room转移到原生sqlite,数据库更新这样处理。

1 // 如果数据库文件不存在,只有onCreate()被调用(该方法在创建数据库时被调用一次)
2 public abstract void onCreate(SQLiteDatabase db);
3 // 如果数据库文件存在,会调用onUpgrade()方法升级数据库,并更新版本号。
4 public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion);

OnCreate : 如果数据库文件不存在,SQLiteOpenHelper在创建数据库文件,打开数据库这个数据库后,调用onCreate()方法,在该方法中一般需要创建表、视图等组件。在创建前数据库一般是空的,因此不需要先删除数据库中相关的组件。

OnUpgrade : 当系统在构造SQLiteOpenHelper类的对象时,如果发现版本号不一样,就会自动调用onUpgrade函数,让你在这里对数据库进行升级。

新版本号和老版本号都会作为onUpgrade函数的参数传进来,便于开发者知道数据库应该从哪个版本升级到哪个版本。

升级完成后,数据库会自动存储最新的版本号为当前数据库版本号。

需要对SQLite数据库的结构进行升级:

SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段。
并且只能在表的末尾添加字段,比如,为 Student添加两个字段:
1 ALTER TABLE Student ADD COLUMN UserPhone VARCHAR;
2 ALTER TABLE Student ADD COLUMN UserNickName VARCHAR;

如果遇到复杂的修改操作,比如在修改的同时,需要进行数据的转移,那么可以采取在一个事务中执行如下语句来实现修改表的需求。

1. 将表名改为临时表
         ALTER TABLE Student RENAME TO __temp__Student;

2. 创建新表
        CREATE TABLE Student (UserId VARCHAR(32) PRIMARY KEY ,UserName VARCHAR(32) NOT NULL ,UserAddress VARCHAR(16) NOT NULL);
  
3. 导入数据  
         INSERT INTO Student  SELECT UserId, “”, UserAddress FROM __temp__Student;
或者  
        INSERT INTO Student()  SELECT UserId, “”, UserAddress FROM __temp__Student;
* 注意 双引号”” 是用来补充原来不存在的数据的
  
4. 删除临时表  
        DROP TABLE __temp__Student;

通过以上四个步骤,就可以完成旧数据库结构向新数据库结构的迁移,并且其中还可以保证数据不会应为升级而流失。
  当然,如果遇到减少字段的情况,也可以通过创建临时表的方式来实现。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值