default:

break;

}

}

}

}

其中的SQL的建表语句为:

public class SQL {

public static final String T_FAVORITE = “favorite”;

public static final String CREATE_TABLE_FAVORITE =

"CREATE TABLE IF NOT EXISTS " + T_FAVORITE + “(” +

"id VARCHAR PRIMARY KEY, " +

"title VARCHAR, " +

"url VARCHAR, " +

"createDate VARCHAR " +

“)”;

}

(2)v2.0:DATABASE_VERSION=1001,在favorite表添加1个deleted字段

public class DBHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME = “mall.db”;

private static final int DATABASE_VERSION = 1001;

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_FAVORITE);

// 若不是第一个版本安装,直接执行数据库升级

// 请不要修改FIRST_DATABASE_VERSION的值,其为第一个数据库版本大小

final int FIRST_DATABASE_VERSION = 1000;

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 1000:

upgradeToVersion1001(db);

break;

default:

break;

}

}

}

private void upgradeToVersion1001(SQLiteDatabase db){

// favorite表新增1个字段

String sql1 = “ALTER TABLE “+SQL.T_FAVORITE+” ADD COLUMN deleted VARCHAR”;

db.execSQL(sql1);

}

}

(3)v3.0:DATABASE_VERSION=1002,在favorite表中添加message和type字段

public class DBHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME = “mall.db”;

private static final int DATABASE_VERSION = 1002;

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_FAVORITE);

// 若不是第一个版本安装,直接执行数据库升级

// 请不要修改FIRST_DATABASE_VERSION的值,其为第一个数据库版本大小

final int FIRST_DATABASE_VERSION = 1000;

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 1000:

upgradeToV

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

开源分享完整内容戳这里

ersion1001(db);

break;

case 1001:

upgradeToVersion1002(db);

break;

default:

break;

}

}

}

private void upgradeToVersion1001(SQLiteDatabase db){

// favorite表新增1个字段

String sql1 = “ALTER TABLE “+SQL.T_FAVORITE+” ADD COLUMN deleted VARCHAR”;

db.execSQL(sql1);

}

private void upgradeToVersion1002(SQLiteDatabase db){

// favorite表新增2个字段,添加新字段只能一个字段一个字段加,sqlite有限制不予许一条语句加多个字段

String sql1 = “ALTER TABLE “+SQL.T_FAVORITE+” ADD COLUMN message VARCHAR”;

String sql2 = “ALTER TABLE “+SQL.T_FAVORITE+” ADD COLUMN type VARCHAR”;

db.execSQL(sql1);

db.execSQL(sql2);

}

}

这就是升级的一个步骤。在onCreate中去执行onUpgrade。

数据库升级原理


在使用数据库时,我们会定义一个继承了SQLiteOpenHelper的子类,就比如刚才的DBHelper。我们通过版本号去更新一个数据库。我们更新一次数据库,当应用去访问数据库的时候就会读取数据库的版本号,如果和之前不一样,则会调用onUpgrade方法。

SQLiteOpenHelper的构造方法:

在这里插入图片描述

当版本号小于1时,是会报错的。 CursorFactory和DatabaseErrorHandler我们一般传null。

SQLiteOpenHelper的使用:

在这里插入图片描述

DatabaseHelper是继承了SQLiteOpenHelper的数据库类,其中,getWritableDatabase( )会调用getDatabaseLocked(false)方法,在该方法中实现了对数据库版本检查和升级等的逻辑。其中部分代码如下,

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐