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

原创 2017年10月17日 15:20:09

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();
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android数据库升级总结

Android数据库升级
  • honeysx
  • honeysx
  • 2016年03月12日 15:13
  • 1210

笔记:数据平滑扩容和迁移

3种方式 1)停止服务 ->  qian 2)
  • span76
  • span76
  • 2014年09月01日 16:34
  • 1700

greendao数据库升级(数据库表的迁移)

app开发期间的数据库升级 我们使用DevOpenHelper打开数据库 12 DaoMaster.DevOpenHelper helper = new DevOp...
  • yinzhijiezhan
  • yinzhijiezhan
  • 2016年10月19日 18:22
  • 1990

JIRA数据迁移到不同服务器及升级(7.1.4升级到7.3.4)

JIRA SoftWare 官网有关备份/恢复JIRASoftware系统数据文档(071版本): https://confluence.atlassian.com/admin...
  • weixin_38947413
  • weixin_38947413
  • 2017年09月02日 14:18
  • 956

Android数据库表升级(添加列),并保留原表中的数据---以后有其他升级操作将会更新该文

最近项目中需要为数据库中已存在的表添加新的字段,这也是当初设计表时的不足,前人留坑,后人遭殃。。。。并且更过分的是,发现数据库设计的严重缺陷!!有很多个库,每个库中都有所有的表,但是每个库用到的只是其...
  • sunnyjerry
  • sunnyjerry
  • 2017年01月05日 11:34
  • 2008

CoreData(数据库升级 )版本迁移-iOS App升级安装

如果IOS App 使用到CoreData,并且在上一个版本上有数据库更新(新增表、字段等操作),那在覆盖安装程序时就要进行CoreData数据库的迁移,具体操作如下: 1.选中你的mydata.x...
  • SoundsGood
  • SoundsGood
  • 2015年10月23日 19:55
  • 3302

关于Android数据库版本升级的一点资料

在网上找了大把大把的资料、还是没能怎么弄清楚关于s
  • wa991830558
  • wa991830558
  • 2014年07月31日 17:22
  • 5386

SharePoint 2013 迁移内容数据库最简单的配置方法

SharePoint 2013 迁移内容数据库最简单的配置方法 1,如果你喜欢使用命令可以使用power shell 来做。 我说的是使用数据库配置的方法。      SharePoint 2013 ...
  • jason_dct
  • jason_dct
  • 2015年06月02日 11:42
  • 3413

【android】数据库升级完整解决方案

作者:飞翔的猫咪 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://flyingcat2013.blog.51cto.co...
  • u011494050
  • u011494050
  • 2014年08月23日 14:19
  • 2629

将TFS数据库迁移到新数据库服务器--TFS数据库迁移部署

前言: 如果要原TFS服务器上有多个TFS集合,而要迁移的TFS数据库仅有1个集合,则请在执行文章后面的操作前,在将TFS_Configuration数据库还原到新数据库中后,先在TFS_Confi...
  • babauyang
  • babauyang
  • 2013年02月27日 10:04
  • 9106
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 数据库综述(一) 数据库片的升级与数据的迁移操作
举报原因:
原因补充:

(最多只允许输入30个字)