现在的位置: 首页 > 综合 > 正文

android数据升级方案

2018年02月16日 ⁄ 综合 ⁄ 共 2294字 ⁄ 字号 评论关闭

    在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: 删除临时表即可

抱歉!评论已关闭.