在android中有时候需要对本地数据库做升级,通常做的方案大概是这样子的:

A: onUpgrade方法中,根据当前的oldVersion和newVerson,判断我们需要在哪些版本后开始升级,若不在设定的升级版本之前,则不做处理否则进行升级处理

 @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        // 8版本之前,按照原代码处理        if (oldVersion < 8) {            upgradeDropDB(db, oldVersion, newVersion);            return;        }        // SQLiteOpenHelper中已经添加事务,数据库更新不需要添加事务        // 根据oldVersion,循环升级,每次升级一个版本        while (oldVersion < newVersion) {            upgradeDB(db, oldVersion, newVersion);            oldVersion++;        }    }

B: 进行升级处理 【在制定版本之前删除以前所有的表】

 private void upgradeDropDB(SQLiteDatabase db, int oldVersion, int newVersion) {        if (oldVersion < 8) {            db.execSQL("DROP TABLE IF EXISTS "                    + DBConstants.DB_TABLE.TABLE_PROVINCE);            db.execSQL("DROP TABLE IF EXISTS "                    + DBConstants.DB_TABLE.TABLE_CITY);            db.execSQL("DROP TABLE IF EXISTS "                    + DBConstants.DB_TABLE.TABLE_DISTRICT);            db.execSQL("DROP TABLE IF EXISTS "                    + DBConstants.DB_TABLE.TABLE_STREET);            db.execSQL("DROP TABLE IF EXISTS "                    + DBConstants.DB_TABLE.TABLE_MOBILE_PAYMENT_BROWSE);            db.execSQL("DROP TABLE IF EXISTS "                    + DBConstants.DB_TABLE.TABLE_ADDRESS);            db.execSQL("DROP TABLE IF EXISTS "                    + DBConstants.DB_TABLE.TABLE_USER_ACCOUNT);            onCreate(db);        }
否则做升级

    /*     * 数据库升级方法:根据oldVersion,每次升级一个版本     */    private void upgradeDB(SQLiteDatabase db, int oldVersion, int newVersion) {        switch (oldVersion) {            case 8:                // 创建temp表                db.execSQL(DBConstants.CREATE_TEMP_TABLE_USER_ACCOUNT);                // 创建新表                db.execSQL(DBConstants.CREATE_TABLE_USER_ACCOUNT_SQLITE);                // 插入表数据                db.execSQL(DBConstants.INSERT_TABLE_USER_ACCOUNT_DATA);                // 删除temp表                db.execSQL(DBConstants.DROP_TABLE_USER_ACCOUNT);                break;            default:                break;        }    }

 // 将现有数据表数据,名字进行变更    public static final String CREATE_TEMP_TABLE_USER_ACCOUNT = "alter table table_user_account rename to _temp_table_user_account";    // 添加数据    public static final String INSERT_TABLE_USER_ACCOUNT_DATA = "insert into table_user_account select *,'' from _temp_table_user_account";    // 删除掉中间表    public static final String DROP_TABLE_USER_ACCOUNT = "drop table _temp_table_user_account";    // 创建新表    public static final String CREATE_TABLE_USER_ACCOUNT_SQLITE = "create table  if  not exists "            + DBConstants.DB_TABLE.TABLE_USER_ACCOUNT            + "(_id integer primary key autoincrement,"            + DBConstants.USER_ACCOUNT.ACCOUNT_NAME            + " text,"            + DBConstants.USER_ACCOUNT.LOGIN_TIME            + " integer,"            + DBConstants.USER_ACCOUNT.ACCOUNT_PWD            + " text,"            + DBConstants.USER_ACCOUNT.LOGIN_TYPE + " text"            // + ","            // + DBConstants.USER_ACCOUNT.REMEMBER_PWD + " integer"            + ")";
过程是这样子的:

1: 生成一个现有表的的临时表【主要用来存储现有表中的数据】

2: 创建一个与现有表同名的新表【里面会添加字段】

3:将临时表中的数据插入到新建的表中

4: 删除临时表即可




更多相关文章

  1. Android Webservices 返回多行多列数据(Dataset)
  2. 手把手教你:android调用系统相机、相册功能,适配6.0权限获取以及7.
  3. Android 如何导入已有的外部数据库
  4. Android性能优化-数据优化
  5. Android通过http协议数据交互的两种方式
  6. Android在API推荐的方式来实现SQLite数据库的增长、删除、变化、
  7. Android 通过Post方式提交数据
  8. 重写Android Log的输出,只在debug的时候输出,release 的版本不输出
  9. Android版本28用http请求CLEARTEXT communication to www.xxxxx.

随机推荐

  1. Android TextUtils类介绍
  2. 如何改变Android Progressbar默认颜色
  3. android收集应用崩溃信息
  4. AES加解密算法在Android中的应用及Androi
  5. Android图片的固定大小显示
  6. [置顶] 在Android(安卓)2.3状态栏中增加m
  7. Android(安卓)用 ListView 实现倒计时列
  8. android 一些总结 1.2-1.10
  9. Android(安卓)性能优化(二)Handler运行机制
  10. Android布局方式(AbsoluteLayout)学习