数据库升级

本文介绍了Android应用程序中数据库版本管理的重要性及具体实现方法。通过实例展示了如何处理不同版本间的数据库迁移,包括表结构调整、数据更新等关键步骤。
之前一直不知道这个东西是干什么的,数据库的版本号也是随便定义的,还有两个版本号。 
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.‬这就是处理数据更新的过程。  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值