增加表
1.在onCreate新建Category表,这种方法需要用户卸载老版本再安装新版的程序;(不可取)软件卸载造成老数据的丢失。
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK = "create table Book ("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text)";
public static final String CREATE_CATEGORY = "create table Category ("
+ "id integer primary key autoincrement, "
+ "category_name text, "
+ "category_code integer)";
----------省略
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
}
-----------省略
}
- 升级版本号,触发onUpgrade()方法,然后删除存在的表,再建表。(不可取)原因也是会造成数据的丢失。
----------
@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);
}
---------
3.升级版本号,在onUpgrade只创建新表如下:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion ==1) {
db.execSQL(CREATE_CATEGORY);
}
}
修改表定义
比如Category表添加pageNo字段。
SQLite数库对ALTER TABLE命令支持非常有限,只能在表末尾添加列,不能修改列定义,不能删除已有的列。我们可以采用临时表的办法。具体来说有四步:
*将现有表重命名为临时表;
*创建新表;
*将临时表的数据导入新表(注意处理修改的列);
*删除临时表。
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion) {
case 1:
//如果老版本是1,则新建Category表,即增加表的3方法
createCategoryTable(db);
case 2:
//如果老版本是2,
db.execSQL("ALTER TABLE Category RENAME TO Category_temp");
db.execSQL("CREATE TABLE Category(id integer primary key autoincrement,"
+ "category_name text, "
+"category_code integer"
+ "pageNo integer)");
db.execSQL("insert into Category(id, category_name, category_code, pageNo) "
+ "select id, category_name, category_code, 100 from Category_temp");
db.execSQL("DROP TABLE Category_temp");
break;
}
}