方案一 第三方库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);
}
}