加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

App版本更新时对SQLite数据库表的修改问题

发布时间:2020-12-12 19:39:57 所属栏目:百科 来源:网络整理
导读:在数据库版本升级时, 我们可能会遇到这样一些情况: 需要扩展一个表的字段 删除掉原来表上某个冗余的字段 新建一个表 而处理上面这些问题都要在不损害旧数据库历史数据的前提下完成。 首先,我们都知道,当我们的数据库版本号从低版本到高版本的升级之后,

在数据库版本升级时, 我们可能会遇到这样一些情况:

  1. 需要扩展一个表的字段
  2. 删除掉原来表上某个冗余的字段
  3. 新建一个表

而处理上面这些问题都要在不损害旧数据库历史数据的前提下完成。

首先,我们都知道,当我们的数据库版本号从低版本到高版本的升级之后,会调用SQLiteOpenHelper中的
onUpgrade(SQLiteDatabase sqLiteDatabase,int oldVersion,int newVersion)方法。这时我们就可以在这里去处理这些升级逻辑。

扩展一个表的字段在onUpgrade中的实现为:

@Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase,int oldVersion,int newVersion) {
        //数据库表最后面添加一个字段
        if(oldVersion < newVersion){
            sqLiteDatabase.execSQL("ALTER TABLE ShoppingCar ADD COLUMN productDescp text");
        }
    }

SQLite 对 ALTER TABLE 的支持是有限的,你可以在一个存在表上添加一个字段到末尾,或者是改变表的名称。但如果你想做更复杂的操作,比如删除一个表已有的字段,就要重新创建这个表并完成数据迁移,而不能使用DROP COLUMN这样方便的命令了。详见SQLite Frequently Questions

比如表ShoppingCar原来有三个字段CID(主键)、productName、productDescp,现在想删除productDescp字段,那么在onUpgrade中写法如下:

@Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase,int newVersion) {
        //数据库表删除指定字段
        if(oldVersion < newVersion){
            sqLiteDatabase.beginTransaction();  //启动事务
            try {
                sqLiteDatabase.execSQL("CREATE TEMPORARY TABLE Car (CID INTEGER PRIMARY KEY AUTOINCREMENT," +
                        "productName varchar(200));");  //创建临时表Car
                sqLiteDatabase.execSQL("INSERT INTO Car SELECT CID,productName FROM ShoppingCar;"); //保存ShoppingCar的数据
                sqLiteDatabase.execSQL("DROP TABLE ShoppingCar;");  //删除ShoppingCar表
                sqLiteDatabase.execSQL("CREATE TABLE ShoppingCar (CID INTEGER PRIMARY KEY AUTOINCREMENT," +
                        "productName varchar(200));"); //再重新建立新的ShoppingCar表,这次少了productDescp字段
                sqLiteDatabase.execSQL("INSERT INTO ShoppingCar SELECT CID,productName FROM Car;");//将临时表Car上的数据保存到新建的ShoppingCar表上
                sqLiteDatabase.execSQL("DROP TABLE Car;");//删除临时表Car
                sqLiteDatabase.setTransactionSuccessful();
            } finally {
                sqLiteDatabase.endTransaction(); //事务结束
            }
        }
    }

这样就既完成了对productDescp字段的删除也保留了原来表上的数据。

最后一种情况最简单直接执行CREATE语句就要可以了。

@Override
public void onUpgrade(SQLiteDatabase db,int newVersion) {
    if(oldVersion < 2) {
        db.execSQL("CREATE TABLE newtb(Nid text,b text);");
    }
}

最后,该文章也是按照下面文章copy来的,谢谢了。大家可以看下。

http://www.pedant.cn/2014/08/01/sqliteopenhelper-onupgrade-ondowngrade-handle/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读