一、背景
在Android应用中,UI,网络,数据库是最重要的模块。数据库的设计也十分重要,扩展性,易用性都要考虑。随着应用的升级,原有的数据库不能满足新的需求,增加字段,增加表的情况经常出现。
二、两个方法:
public void onCreate (SQLiteDatabase db)
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion)
三、简单的升级方法:
1、重新创建数据库,数据会丢失:
db.execSQL("DROP TABLE IF EXISTS " + Tables.CONTACTS + " ; ");
onCreate(db);
2、直接增加字段:
ALTER TABLE Tables.CONTACTS ADD COLUMN NAME;
四、复杂的升级:
1、将表A重命名,改了Table_temp。
2、创建新表Table。
3、将表Table_temp的数据插入到表Table。
4、删除表Table_temp。
protected void upgradeTables(SQLiteDatabase db, String tableName, String columns) {
try {
db.beginTransaction();
String tempTableName = tableName + "_temp" ;
String sql = "ALTER TABLE " + tableName +" RENAME TO " + tempTableName;
execSQL(db, sql, null );
onCreateTable(db);
sql = "INSERT INTO " + tableName + " (" + columns + ") " + " SELECT " + columns + " FROM " + tempTableName;
execSQL(db, sql, null );
execSQL(db, "DROP TABLE IF EXISTS " + tempTableName, null );
db.setTransactionSuccessful();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
db.endTransaction();
}
}
五、不同版本的数据库升级。
1、通常情况下,每一次数据库升级都会增加字段或者表,用户并不一定一直跟随你的步伐,每次都会升级,这样就可能存在跨版本升级。
3、这样的用户A和用户B需要升级的话,需要定义:
. - - >. - - >
. - - >. - - >
4、实现onUpgrade:
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
int upgradeVersion = oldVersion;
if (10 == upgradeVersion) {
// Create table Calls
String sql = "CREATE TABLE ...";
db.execSQL(sql);
upgradeVersion = 11;
}
if (11 == upgradeVersion) {
// Modify table Contacts
upgradeVersion = 12;
}
if (upgradeVersion != newVersion) {
// Drop tables
db.execSQL("DROP TABLE IF EXISTS " + tableName);
// Create tables
onCreate(db);
}
}