Android数据库升级解决方案

方案一 第三方库ActiveAndroid数据库

在对应继承model的实体类中添加的字段,并且对应的数据库版本升级+1.在assert资源文件添加一个migrations文件夹,里面创建文件“版本号.sql”,文件中添加数据库脚本,即"ALTER TABLE 表名 COLUMN Priority TEXT"

方案二 通过SQLiteOpenHelper的特性

特性

SQLiteOpenHelper有两个回调方法,分别为onCreate()、onUpgrade()。onCreate()软件第一次安装创建数据库会回调,如果后面其他版本升级不回调该方法,会回调onUpdate()方法。

举例

软件有三个版本了,即V3.0。如下有3种安装情况:
1.v 1.0------> v3.0 不回调onCreate,回调onUpgrade
2.v 2.0------> v3.0 不回调onCreate,回调onUpgrade
3.v 30直接安装 回调onCreate,不会回调onUpgrade
为了兼容各种情况安装app,保证数据库表的字段都能完美添加进去:
1.v 1.0------> DATABASE_VERSION=1001 onCreate 创建数据表
2.v 2.0------> DATABASE_VERSION=1002 onCreate ---- 创建数据表(v1.0代码不变),并调取onUpgrade(DATABASE_VERSION>1001)
onUpgrade()方法里面添加name
3.v3.0 ------> DATABASE_VERSION=1003 onCreate ---- 创建数据表 (v1.0代码不变)
onUpgrade(DATABASE_VERSION>1001)
onUpgrade --添加-- name(v2.0代码不变)
onUpgrade --添加-- address year

思路

数据库升级解决方案思路如下:软件第一次安装创建在oncreate()方法里面创建数据库和表,并调取重写对应的onUpgrade()方法,在对应的onUpgrade()方法中不同版本去创建对应的字段,从而保证数据库完美升级。

代码实现

其中SQL.java是建表语句

public class SQL {
    public static final String T_USER = "user";
 
 
    public static final String CREATE_TABLE_USER =
            "CREATE TABLE IF NOT EXISTS " + T_USER + "(" +
                    "id VARCHAR PRIMARY KEY, " +
                    "school VARCHAR, " +
                    "sex VARCHAR, " +
                    "createDate VARCHAR " +
                    ")";
}
public class DBHelper extends SQLiteOpenHelper {
 
    private static final String DATABASE_NAME = "simple.db"; 
    private static final int DATABASE_VERSION = 1003;
 
    private static DBHelper instance = null;
 
 
    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
     
    public synchronized static DBHelper getInstance(Context context) {
        if (instance == null) {
            instance = new DBHelper(context);
        }
        return instance;
    }
 
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL.CREATE_TABLE_USER);
         
        // 若不是第一个版本安装,直接执行数据库升级
        // 请不要修改FIRST_DATABASE_VERSION的值,其为第一个数据库版本大小
        final int FIRST_DATABASE_VERSION = 1001;
        onUpgrade(db, FIRST_DATABASE_VERSION, DATABASE_VERSION);
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 使用for实现跨版本升级数据库
        for (int i = oldVersion; i < newVersion; i++) {
            switch (i) {
            case 2:
                upgradeToVersion01(db);
                break;
            case 3:
                upgradeToVersion02(db);
                break;
            default:
                break;
            }
        }
    }
     
    private void upgradeToVersion01(SQLiteDatabase db){
        // user表新增1个字段
        String sql1 = "ALTER TABLE "+SQL.T_FAVORITE+" ADD COLUMN name VARCHAR";
        db.execSQL(sql1);
    }																			
    private void upgradeToVersion02(SQLiteDatabase db){
        // user表新增2个字段,添加新字段只能一个字段一个字段加,sqlite有限制不予许一条语句加多个字段
        String sql1 = "ALTER TABLE "+SQL.T_USER+" ADD COLUMN address VARCHAR";
        String sql2 = "ALTER TABLE "+SQL.T_USER+" ADD COLUMN age VARCHAR";
        db.execSQL(sql1);
        db.execSQL(sql2);
    }
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值