- 软件v1.0
安装v1.0,假设1.0版本只有一个account表,这时继续走SQLiteOpenHelper的onCreate,不走onUpgrade
- 软件v2.0
有两种安装软件的情况:
1)v1.0 --> v2.0 不走onCreate,执行onUpgrade
2)v2.0 (直接安装)直接onCreate
v1.0只有一个account表,软件升级到2.0需要新增一个member表,有两个方法,一是在onUpgrade中添加member方法,另一种就是用户从来没有安装这个软件,直接安装v2.0,这时走onCreate。
- 软件v3.0
假设v3.0又新增一个news表,这里有三种情况:
1)v1.0 --> v3.0 不走onCreate ,走onUpgrade
2)v2.0 --> v3.0 不走onCreate,走onUpgrade
3)v3.0(直接安装) 直接onCreate
那么数据库添加表语句在哪里写呢?数据库有一个版本号DATABASE_VERSION表示,其实就是要么在onCreate中要么就在onUpgrade中添加,下面有一种做法
1)v1.0 DATABASE_VERSION=1000 onCreate 添加 account
2)v2.0 DATABASE_VERSION=1001 onCreate 添加 account(v1.0代码不变)
onUpgrade(DATABASE_VERSION > 1000) onUpgrade 添加 member
3)v3.0 DATABASE_VERSION=1002 onCreate 添加 account(v1.0代码不变)
onUpgrade(DATABASE_VERSION > 1001)onUpgrade 添加 member(v2.0代码不变)
onUpgrade 添加 news
这样就可以解决问题了 ,第一版本的都在onCreate,其他版本新增的在onUpgrade,而且在onCreate中执行onUpgrade。
通过数据库版本号来判断要不要Upgrade,如果当前的DATABASE_VERSION比安装数据库的版本号大的时候,就会进入onUpgrade。
下列是一个例子:来自传送门
(1)v1.0 DATABASE_VERSION=1000,添加一个favorite表。
public class DBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = “mall.db”;
private static final int DATABASE_VERSION = 1000;
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) {
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,在favor
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
ite表添加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;
}
}
}