Android SQLite 升级数据版本

使用 SQLite 保存数据一个绕不过去的弯就是要频繁的对它进行升级数据版本,这种升级不是针对 SQLite 而是针对里面的数据

我们常常会出现这一种情况,上个版本刚在 SQLite 中建好的表,在这次需求中差一个字段,或者数据类型不对

比如,我们在上一个版本中创建了一个数据库 msdb.db 里面有一张用户表,只有两个字段 idusername ,然后这次需求需要保存用户的邮箱 email,那么,就要对上一个版本的数据库 msdb.db 进行升级了

出现这种情况,我们就要对之前创建的 SQLite 数据进行升级了,以适应新版本

常见做法

升级 SQLite 中的数据,常见的做法是在 onUpdate() 中创建一个临时的数据库 A,然后把所有的数据读出来,进行修正,然后写到临时的数据库 A 中,再把老的数据库删掉,把新的数据库 rename 成老的数据库名

方法大概就是这样,但,具体实现过程中,坑多多

升级数据库版本实操

  1. 首先把所有升级数据库的操作都放到 onUpgrade() 方法中

  2. 在实例化自定义 SQLiteOpenHelper 的时候,修改版本号,比如把 1 改成 2

这样,就会自动调用 onUpgrade() 的方法了

对于每个数据库版本我们都应该做好相应的记录(文档),类似于下面这种

数据库版本 andoid对应版本 内容
v1.0 1 第一个版本,包含两个字段...
v1.1 2 数据保留,新增 user_name 字段

升级 SQLite 数据版本中常见的疑问

  1. 应用升级,数据库文件是否会删除?

    不会!数据什么的都在

  2. 如果我想删除表中某个字段或者增加一个新的字段,原先的数据还在吗?

    在的!

  3. 假如我们已经升级到第三个版本了,我们在第二个版本增加了一个表,然后第三个版本也增加了一个表

    现在有些用户直接从第一个版本升级到第三个版本,要怎么做?

    很简单,可以在 onUpgrade() 里写一个 if 语句对版本进行判断

    public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource,
                int arg2, int arg3) {
    
        if (arg2 < 2 )
        {
            db.execSQL(第一个版本的建表语句);
        }
    
        if (arg2 < 3 ) {
            db.execSQL(第一个版本的建表语句);
        }
    
        if (arg2 < 4 ) {
            db.execSQL(第一个版本的建表语句);
        }
    }
    

    当然了,这个方法可以改良,可以用一个数组来保存所有的语句,执行相应区间内的语句

  4. 旧表的设计太糟糕,很多字段要改,改动太多,想建一个新表,但是表名要一样

    大部分都属于这种类型,就是缺个字段之类的

    这里说一种很通用的方法

    1. 将旧表改名成临时表

      ALTER TABLE User RENAME TO _temp_User;
      
    2. 创建新表

      CREATE TABLE User (u_id INTEGER PRIMARY KEY,u_name VARCHAR(20),u_age VARCHAR(4));
      
    3. 导入数据

      INSERT INTO User SELECT u_id,u_name,"18" FROM _temp_User;
      

      原表中没有的要自己设个默认值

    4. 删除临时表

      DROP TABLE_temp_User;
      

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.