熟悉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数据库版本为1,想要新增一张表有两种方法
一、卸载程序,重新下载最新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); }....
记得改版本号