• Android onUpdate


    从开始一直不知道这个东西是干什么的,数据库的版本号也是随便定义的,还有两个版本号。
    Android在设计时,就考虑到了数据库的更新。当检测到版本有变化时,就会对数据库更新,执行这个操作。

    所以定义数据库的版本还是比较重要的,如第一个程序版本时定义的数据库版本为1,在程序发布新版时有对数据库更新操作,可能增加表,增加列,如果没有调整这个版本,数据库不会创建新的表,也不会添加新的列,安装新版的程序就会崩溃了。

    查了一些资料终于明白了。
    ContactsDatabaseHelper这个是系统 联系人的源码中的一个类,里面已经定义了版本为353,
    @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}在这个方法里处理了更新

    大概代码是这样的
    Java代码
    ‪1.‬if (oldVersion < 99) {直接删除所有的表,重建,有可能是变化太大的问题吧。} 
    ‪2.‬ 
    ‪3.‬if (oldVersion == 100) { 
    ‪4.‬CREATE INDEX创建一个新的索引 
    ‪5.‬oldVersion++;增加旧版本号, 
    ‪6.‬} 
    ‪7.‬。。。之后多个操作,依次增加版本号。 
    ‪8.‬ 
    ‪9.‬if (oldVersion == 105) { 
    ‪10.‬            upgradeToVersion202(db);//直接增加到202 
    ‪11.‬            oldVersion = 202; 
    ‪12.‬        } 
    ‪13.‬ 
    ‪14.‬对于数据库的版本号还要严格地处理。 
    ‪15.‬这里 对oldVersion操作完成后需要与newVersion一样,才算升级成功。 
    ‪16.‬if (oldVersion != newVersion) { 
    ‪17.‬throw new IllegalStateException( 
    ‪18.‬         "error upgrading the database to version " + newVersion); 
    ‪19.‬} //当然这不是强制要求的, 
    ‪20.‬upgrade就结束了。 
    ‪21.‬这样数据库版本号就是newVersion,如果下一次要升级,就至少要比这个高才会触发。 

    也许有人会问,如果当前的表的存了数据,程序又不愿重新安装,更新数据库时要保留原来的数据怎么办呢?
    以上的版本升级是必然要做的事,但是没有提到数据更新的问题。
    如果不是删除原来的表格,只是增加了一列,可能会要求对这列赋默认的值

    Java代码
    ‪1.‬上面有一个跨度较大的就是100多到202的升级: 
    ‪2.‬upgradeToVersion202(SQLiteDatabase db)看这个方法: 
    ‪3.‬db.execSQL( 
    ‪4.‬                "ALTER TABLE " + Tables.PHONE_LOOKUP + 
    ‪5.‬                " ADD " + PhoneLookupColumns.MIN_MATCH + " TEXT;"); 
    ‪6.‬增加了一列。 
    ‪7.‬ 
    ‪8.‬SQLiteStatement update = db.compileStatement( 
    ‪9.‬                "UPDATE " + Tables.PHONE_LOOKUP + 
    ‪10.‬                " SET " + PhoneLookupColumns.MIN_MATCH + "=?" + 
    ‪11.‬                " WHERE " + PhoneLookupColumns.DATA_ID + "=?"); 
    ‪12.‬创建更新语句。 
    ‪13.‬ 
    ‪14.‬Cursor c = db.query(Tables.PHONE_LOOKUP + " JOIN " + Tables.DATA + 
    ‪15.‬                " ON (" + PhoneLookupColumns.DATA_ID + "=" + DataColumns.CONCRETE_ID + ")", 
    ‪16.‬                new String[]{Data._ID, Phone.NUMBER}, null, null, null, null, null); 
    ‪17.‬处理新的列。 
    ‪18.‬ 
    ‪19.‬更新数据。 
    ‪20.‬try { 
    ‪21.‬            while (c.moveToNext()) { 
    ‪22.‬                long dataId = c.getLong(0); 
    ‪23.‬                String number = c.getString(1); 
    ‪24.‬                if (!TextUtils.isEmpty(number)) { 
    ‪25.‬                    update.bindString(1, PhoneNumberUtils.toCallerIDMinMatch(number)); 
    ‪26.‬                    update.bindLong(2, dataId); 
    ‪27.‬                    update.execute(); 
    ‪28.‬                } 
    ‪29.‬            } 
    ‪30.‬        } finally { 
    ‪31.‬            c.close(); 
    ‪32.‬        } 
    ‪33.‬这就是处理数据更新的过程。 

    博客文章列表居然发现三个,删除一个就全没了。这次格式乱了
    欧克蓝科技
  • 相关阅读:
    Vs2010 编辑器自动提示crash的解决办法
    史丹佛毕业25年 我最有钱的同学是...zz
    Workerman3 创建wss服务 利用apache代理wss
    vue面试装X知识汇总
    接:this is incompatible with sql_mode=only_full_group_by
    vue2 nuxtjs 使用与安装
    linux 升级安装最新版本的composer2.0
    Ubuntu20.04LTS 添加环境变量
    this is incompatible with sql_mode=only_full_group_by
    CC2420与IEEE802.15.4关系
  • 原文地址:https://www.cnblogs.com/sias/p/3763513.html
Copyright © 2020-2023  润新知