public class BaseDBHelper extends sqliteOpenHelper { private static final String TAG = BaseDBHelper.class.getSimpleName(); private static String DATABASE_NAME = "HealthBand.db"; private static int DATABASE_VERSION = 18; protected BaseDBHelper() { super(App.getInstance(),DATABASE_NAME,null,DATABASE_VERSION); } private static BaseDBHelper sHelper; public static BaseDBHelper getInstance() { if (sHelper == null) { sHelper = new BaseDBHelper(); } return sHelper; } @Override public void onCreate(sqliteDatabase db) { Log.d(TAG,"BaseDBHelper onCreate()"); db.execsql(ExerciSEOriginalCons.TABLE_CREATE); db.execsql(ExerciseDailyCons.TABLE_CREATE); db.execsql(SleepOriginalCons.TABLE_CREATE); db.execsql(SleepSectionCons.TABLE_CREATE); db.execsql(SedentaryCons.TABLE_CREATE); db.execsql(AlarmCons.TABLE_CREATE); } @Override public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) { Log.i(TAG,"Upgrading DB from version " + oldVersion + " to " + newVersion); if (oldVersion < 13) { upgradeToVersion13(db); oldVersion = 13; } if (oldVersion == 13) { upgradeToVersion14(db); oldVersion += 1; } if (oldVersion == 14) { upgradeToVersion15(db); oldVersion += 1; } if (oldVersion == 15) { upgradeToVersion16(db); oldVersion += 1; } if (oldVersion == 16) { upgradeToVersion17(db); oldVersion += 1; } if (oldVersion < 19) { upgradeToVersion19(db); oldVersion = 19; } } private void upgradeToVersion19(sqliteDatabase db) { db.execsql(ExerciSEOriginalCons.TABLE_DROP); db.execsql(ExerciseDailyCons.TABLE_DROP); db.execsql(SleepOriginalCons.TABLE_DROP); db.execsql(SleepSectionCons.TABLE_DROP); db.execsql(SedentaryCons.TABLE_DROP); onCreate(db); } private void upgradeToVersion17(sqliteDatabase db) { db.execsql(SedentaryCons.TABLE_CREATE); } private void upgradeToVersion16(sqliteDatabase db) { db.execsql(ExerciSEOriginalCons.TABLE_DROP); db.execsql(ExerciseDailyCons.TABLE_DROP); db.execsql(SleepOriginalCons.TABLE_DROP); db.execsql(SleepSectionCons.TABLE_DROP); onCreate(db); } private void upgradeToVersion15(sqliteDatabase db) { db.execsql(ExerciSEOriginalCons.TABLE_DROP); db.execsql(ExerciseDailyCons.TABLE_DROP); db.execsql(SleepOriginalCons.TABLE_DROP); db.execsql(SleepSectionCons.TABLE_DROP); onCreate(db); } private void upgradeToVersion14(sqliteDatabase db) { db.execsql(ExerciSEOriginalCons.TABLE_DROP); db.execsql(ExerciseDailyCons.TABLE_DROP); db.execsql(SleepOriginalCons.TABLE_DROP); db.execsql(SleepSectionCons.TABLE_DROP); onCreate(db); } private void upgradeToVersion13(sqliteDatabase db) { db.execsql(SleepOriginalCons.ADD_END_TIME); } }
onUpgrade
你开发了一个程序,当前是1.0版本。该程序用到了数据库。到1.1版本时,你在数据库的某个表中增加了一个字段。那么软件1.0版本用的数据库在软件1.1版本就要被升级了。
软件的1.0版本升级到1.1版本时,老的数据不能丢。那么在1.1版本的程序中就要有地方能够检测出来新的软件版本与老的数据库不兼容,并且能够有办法把1.0软件的数据库升级到1.1软件能够使用的数据库。换句话说,要在1.0软件的数据库的那个表中增加那个字段,并赋予这个字段默认值。
sqliteOpenHelper类的构造函数有一个参数是int version,它的意思就是指数据库版本号。比如在软件1.0版本中,我们使用sqliteOpenHelper访问数据库时,该参数为1,那么数据库版本号1就会写在我们的数据库中。
到了1.1版本,我们的数据库需要发生变化,那么我们1.1版本的程序中就要使用一个大于1的整数来构造sqliteOpenHelper类,用于访问新的数据库,比如2。
当我们的1.1新程序读取1.0版本的老数据库时,就发现老数据库里存储的数据库版本是1,而我们新程序访问它时填的版本号为2,系统就知道数据库需要升级。
当系统在构造sqliteOpenHelper类的对象时,如果发现版本号不一样,就会自动调用onUpgrade函数,让你在这里对数据库进行升级。根据上述场景,在这个函数中把老版本数据库的相应表中增加字段,并给每条记录增加默认值即可。
新版本号和老版本号都会作为onUpgrade函数的参数传进来,便于开发者知道数据库应该从哪个版本升级到哪个版本。
升级完成后,数据库会自动存储最新的版本号为当前数据库版本号。
public abstract class AbsDBHelper { public sqliteDatabase getWritableDatabase() { return BaseDBHelper.getInstance().getWritableDatabase(); } public sqliteDatabase getReadableDatabase() { return BaseDBHelper.getInstance().getReadableDatabase(); } }
public class AlarmDBHelper extends AbsDBHelper { private static AlarmDBHelper sHelper; public static AlarmDBHelper getInstance() { if (sHelper == null) { sHelper = new AlarmDBHelper(); } return sHelper; } public void insertOrThrow(boolean enabled,String name,int time,int cycle) throws sqlException { ContentValues values = new ContentValues(); values.put(KEY_USER_ID,PreferenceUtil.getInt(Preferences.USER_ID)); values.put(KEY_DEVICE_ID,PreferenceUtil.getInt(Preferences.REPOSITORY_ID)); values.put(KEY_ENABLED,enabled); values.put(KEY_NAME,name); values.put(KEY_TIME,time); values.put(KEY_CYCLE,cycle); getWritableDatabase().insertOrThrow(TABLE_NAME,values); } public boolean updateByOldTime(int alarmClockId,boolean enabled,int oldTime,int newTime,int cycle,String updateTime) { ContentValues values = new ContentValues(); values.put(KEY_ALARM_CLOCK_ID,alarmClockId); values.put(KEY_ENABLED,newTime); values.put(KEY_CYCLE,cycle); values.put(KEY_UPDATE_TIME,updateTime); int result = getWritableDatabase().update(TABLE_NAME,values,KEY_USER_ID + "=? and " + KEY_DEVICE_ID + "=? and " + KEY_TIME + "=?",new String[] { String.valueOf(PreferenceUtil.getInt(Preferences.USER_ID)),String.valueOf(PreferenceUtil.getInt(Preferences.REPOSITORY_ID)),String.valueOf(oldTime) }); return result > 0 ? true : false; }