Android 数据库更新 onupgrade

    博客分类:
  • 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. 这就是处理数据更新的过程。

更多相关文章

  1. 【Tech-Android-Other】android操作sdcard中的多媒体文件——音
  2. Android-手机归属地和座机归属地查询
  3. Android(安卓)LifecycleObserver & ScheduledThreadPoolExecutor
  4. Android对数据库表的一个约定:每张表都应该至少有_id这列
  5. android apk自动升级实现
  6. Android利用RecyclerView实现列表倒计时效果
  7. Android(安卓)快速开发数据库greenDao
  8. Android(安卓)ORM——初识greenDAO 3及使用greenDAO 3前应该掌握
  9. Android(安卓)数据库框架LitePal使用详解

随机推荐

  1. Mono for Android: 利用mono for android
  2. Android 基本控件的常用属性
  3. 如何在AOSP构建中设置默认启动程序?
  4. 最新Eclipse配置Android开发环境SDK 并安
  5. android应用如何在有需要时申请root权限?
  6. Android混合应用程序:JQueryMobile ajax不
  7. Android MediaCodec硬解码AAC音频文件(实
  8. 【Android应用开发技术:应用组件】Android
  9. 自定义适配器的实现
  10. Gradle返回包不存在