Android 数据库综述(一) 数据库片的升级与数据的迁移操作

  • SQLiteOpenHelper 是 Android平台提供给我们一个数据库辅助类来创建或打开数据库
  • onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。
  • onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。
  • 除了上述两个必须要实现的方法外,还可以选择性地实现onOpen 方法,该方法会在每次打开数据库时被调用。
  • public class SqlDBHelper extends SQLiteOpenHelper {
        //当前数据库版本号 
        private static final int DB_VERSION = 1;
        //当前数据库的名称
        private static final String DB_NAME = "wisdom.db";
        //数据库中的一系列的表 
        public static final String TABLE_NAME_ART = "t_art";
          ... ... ...
         * 私有的构造函数,只能自己使用,防止绕过同步方法生成多个实例,
         * @param context
        private SqlDBHelper(Context context) {
            super(context, DB_NAME, null, DB_VERSION);
        /*私有的静态对象,为整个应用程序提供一个sqlite操作的静态实例,
         * 并保证只能通过下面的静态方法getHelper(Context context)获得,
         * 防止使用时绕过同步方法改变它*/
        private static SqlDBHelper instance;//这里主要解决死锁问题,是static就能解决死锁问题
         * 为应用程序提供一个单一的入口,保证应用程序使用同一个对象操作数据库,不会因为对象不同而使同步方法失效
         * 其实就是获取数据库操作的实例
         * @param context 上下文
         * @return instance
        public static SqlDBHelper getHelper(Context context) {
            if (instance == null)
                instance = new SqlDBHelper(context);
            return instance;
        @Override
        public void onCreate(SQLiteDatabase sqLiteDatabase) {
            // 构建创建表的sql 
            String sql = "create table if not exists " + TABLE_NAME_ART + " (Id integer primary key autoincrement,art_id integer, art_content text,art_creat_time varchar(50))";
            //执行创建
            sqLiteDatabase.execSQL(sql);
        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
            //构建删除表的SQL 
            String sql = "DROP TABLE IF EXISTS " + TABLE_NAME_ART;
            //执行操作
            sqLiteDatabase.execSQL(sql);
            onCreate(sqLiteDatabase);
    

    在上述过程中,当升级数据库的版本的时候,(改变数据库的版本号就可促发升级操作)onUpgrade方法将会被调用,一般在这里执行升级策略的想关数据缓存操作,在这里执行的是将原来的表直接删除,然后再创建新的表,当然表中的数据也自然而然的被清除到了
    当然这是一种比较暴力而简单的事,也可以采用比较优雅的方式来进行操作 (如下 )

    Android SQLite中优雅的方式进行数据库的升级与数据迁移

    SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段。
    并且只能在表的末尾添加字段,比如,为 t_art_list表中添加两个字段:
    1 ALTER TABLE t_art_list ADD COLUMN Activation BLOB;
    2 ALTER TABLE t_art_list ADD COLUMN Key BLOB;

    所有在进行数据库升级时,涉及到表结构的复杂变动,我们可以采用将原有的表修改(修改一个名称)为临时表,然后创建一个新的表,然后将临时表的数据复制到新的表中,最后把临时表删除即可。

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //oldVersion 数据库旧版本
        //newVersion 数据库新版本
        //这里涉及到不同的版本升级
        if(oldVersion==1){
        }else if(oldVersion==2){
        } ....
        else{
    

    升级过程的操作,流程一至,只不过是操作的数据库相关表不一至

    try {
        // 开始
        mLiteDatabase.beginTransaction();
        //1. 将表名改为临时表
         String alertTable = "ALTER TABLE t_art_list RENAME TO t_art_list_temp";
         db.execSQL(alertTable);
        //2. 创建新表
        String clertNewTableSql = "create table if not exists  t_art_list (Id integer primary key autoincrement,art_id integer, art_content text,art_flag varchar(50))"
        db.execSQL(clertNewTableSql);
        //3. 导入数据  
        String insertSql ="INSERT INTO t_art_list SELECT art_id, art_content,\“\”  FROM t_art_list_temp";
        String insertSql =" INSERT INTO t_art_list()SELECT art_id, art_content,\“\”  FROM t_art_list_temp";
        db.execSQL(insertSql);
          * 注意 双引号”” 是用来补充原来不存在的数据的
        //4. 删除临时表  
        String deleteSql = "DROP TABLE t_art_list_temp";
        db.execSQL(deleteSql);
        // 成功
        mLiteDatabase.setTransactionSuccessful();
    } catch (InterruptedException e) {
        e.printStackTrace();
        //处理回gun 
    } finally {
        mLiteDatabase.endTransaction();