熟悉SQLite的同学都知道 我们继承SQLiteOpenHelper 要重写两个方法
@Override
public void onCreate(SQLiteDatabase db) {
//第一次创建数据库恩文件时候才会执行,之后不会再执行
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//数据库版本号比之前的版本大才会执行这个方法
}
之前面试的时候有被面试官问到,什么时候会用到这两个方法,应该如何使用?
这里代码就不写了,说一下使用场景吧
比如 我们新建了一张表 book.db
public String CREATE_BOOK = "create table BOOK ("
+"id integer primary key autoincrement,"
+"price real,"
+"name text,"
+"pages integer";
db.exexSQL(CREATE_BOOK );
1、现在有需求,需要增加字段
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 使用for实现跨版本升级数据库
for (int i = oldVersion; i < newVersion; i++) {
switch (i) {
case 1:
upgradeToVersion2(db);
break;
case 2:
upgradeToVersion3(db);
break;
default:
break;
}
}
}
private void upgradeToVersion2(SQLiteDatabase db){
// favorite表新增1个字段
String sql1 = "ALTER TABLE "+SQL.T_FAVORITE+" ADD COLUMN deleted VARCHAR";
db.execSQL(sql1);
}
private void upgradeToVersion3(SQLiteDatabase db){
// favorite表新增2个字段,添加新字段只能一个字段一个字段加,sqlite有限制不予许一条语句加多个字段
String sql1 = "ALTER TABLE "+表名E+" ADD COLUMN message VARCHAR";
String sql2 = "ALTER TABLE "+表名+" ADD COLUMN type VARCHAR";
db.execSQL(sql1);
db.execSQL(sql2);
}
2、如何我们想再添加一张 Category表用于图书的分类
public String CREATE_CATEGORY = "create table CATEGORY
("
+"id integer primary key autoincrement,"
+"name text,"
+"code integer";
db.exexSQL(CREATE_CATEGORY );
一、卸载程序,重新下载最新app(比较极端)
二、升级数据库(升级APP时,覆盖安装app,包名路径下的文件包括数据库,不会删除)
那要怎么书写代码呢?
...
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK );
db.execSQL(CREATE_CATEGORY );
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists BOOK");
db.execSQL("drop table if exists CATEGORY");
onCreate(db);
}
....
记得改版本号