10
回答
android 夸版本升级问题
注册华为云得mate10,2.9折抢先购!>>>   
比如说,我最近版本升级了5次,每次都调整了表结构,也就是说,每次升级的时候,我的表结构做了响应调整,但是这样的话,如果有人夸版本升级的时候,导致部分表结构没办法更新,导致程序运行报错,请问有什么好的办法哦?
举报
共有10个答案 最后回答: 3年前

引用来自“loyal”的评论

你检测啊.向下兼容啊!第五次里包含前四次的表结构更新.

按照你的意思,每次更新,把前面的sql更新表结构语句都带上了,这是个办法,

这样做,必须在每个更新sql表结构中,套个try...catch

引用来自“loyal”的评论

你在逗我么?....你当然是判断它是从哪个版本升级到你现在的版本,然后就去升级它的表结构.

可以一次性升级到现在的表结构,就是你自己整理出表结构变化sql.每个越级的你都要整理出来一个.然后根据越级的状况来执行某一个.


另一种方法是,从原版本到现在的版本,依次执行表结构变化的sql.最终不就得到了现在要的表结构了吗 ?

我的目的,不想去检查客户的版本号,把所有的相关的sql都执行一次,即使有的客户,有的数据库字段已经有了,执行其相关sql,肯定会报错,但是,因为每个sql都加个try...catch,程序还是可以依次往下执行其他的sql语句,我觉得,我这样没错呀。
--- 共有 1 条评论 ---
notreami回复 @loyal : 码农何苦为难码农。。。其实我觉得最简单的办法是,以最新的表结构为准,之前的版本的表结构,缺啥字段补啥字段,多了字段删除,这样不就完美解决了? 3年前 回复
SQLiteOpenHelper

里面应该有

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

这个东西的啊?

然后你根据老版本号,switch case,不要加break,他就会根据用户当前版本号,一个一个升级脚本跑上来了。不会出问题的啊


比如

switch(old){

case 1:

      // sql1;

case 2:

      // sql2;

}

只要你的case是按照版本号递增的写出来的,就不会有问题的啊  他跳版本,从1跳到10,那么就case1-case10都执行,等于升级10次

引用来自“黑狗”的评论

SQLiteOpenHelper

里面应该有

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

这个东西的啊?

然后你根据老版本号,switch case,不要加break,他就会根据用户当前版本号,一个一个升级脚本跑上来了。不会出问题的啊


比如

switch(old){

case 1:

      // sql1;

case 2:

      // sql2;

}

只要你的case是按照版本号递增的写出来的,就不会有问题的啊  他跳版本,从1跳到10,那么就case1-case10都执行,等于升级10次

但是,你这样的话,如果中途有个地方出现异常,比如说,有的用户中,有些表中字段已经加过了,这样再执行就报错,会不会退出呢?
--- 共有 1 条评论 ---
黑狗那就是你自己程序没有调试好 其中一个版本根本就是错误的 问题没有出现在你最新的这个版本上 而是你曾经的问题根本就没有结局 3年前 回复

引用来自“黑狗”的评论

SQLiteOpenHelper

里面应该有

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

这个东西的啊?

然后你根据老版本号,switch case,不要加break,他就会根据用户当前版本号,一个一个升级脚本跑上来了。不会出问题的啊


比如

switch(old){

case 1:

      // sql1;

case 2:

      // sql2;

}

只要你的case是按照版本号递增的写出来的,就不会有问题的啊  他跳版本,从1跳到10,那么就case1-case10都执行,等于升级10次

引用来自“天王盖地虎626”的评论

但是,你这样的话,如果中途有个地方出现异常,比如说,有的用户中,有些表中字段已经加过了,这样再执行就报错,会不会退出呢?
我错了,你的做法是合理的,谢谢了。
嗯,同样遇到了这个问题,覆盖安装后直接fc。我的办法是当两个版本中有冲突时,将数据库表中数据直接删除并要求用户重新登录。希望有更好的办法
顶部