从开始一直不知道这个东西是干什么的,数据库的版本号也是随便定义的,还有两个版本号。
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.?这就是处理数据更新的过程。
博客文章列表居然发现三个,删除一个就全没了。这次格式乱了
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.?这就是处理数据更新的过程。
博客文章列表居然发现三个,删除一个就全没了。这次格式乱了