Android-SQLite版本问题

1. 用户 重来没有使用过该软件 不存在数据库,我们

  1). 自动调用 void onCreate(SQLiteDatabase db) 方法 创建数据库

  2).创建 表 ,

  3).给表插入初始化数据,或者 从云端 下载数据

 1 @Override
 2     public void onCreate(SQLiteDatabase db) {
 3         // 1.调用该方法 ,自动创建数据库
 4         Log.i("TAG", "数据库不存在,正在创建新的数据库") ;
 5         
 6         // 2.创建 相对应的表
 7         String sql = "create table tb_test( _id integer primary key autoincrement, name varchar(50) ,intime date)" ;
 8         db.execSQL(sql) ;
 9         Log.i("TAG", "创建表成功") ;
10         
11         // 3.插入初始数据,或者从云端 下载数据
12         String insertSQL = "insert into tb_test(name,intime) values('Jack','2013-11-23')" ;
13         db.execSQL(insertSQL) ;
14         insertSQL = "insert into tb_test(name,intime) values('Toms','2014-09-13')" ;
15         db.execSQL(insertSQL) ;
16         Log.i("TAG", "表插入初始化数据") ;
17     }

 

2.用户使用过该软件 ,版本升级后SQLite如何升级

   1).判断 以前 数据库的版本

   2).升级 表结构

  

 1 @Override
 2     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 3         // 1.判断 数据库的版本
 4         if(oldVersion == 2){
 5             String sql = "alter table tb_test add column isdel int default 0" ;
 6             db.execSQL(sql) ;
 7             Log.i("TAG", "数据库 版本升级, 2.0 --> 3.0") ;
 8         }else if(oldVersion ==1){
 9             String sql = "alter table tb_test add column isdel int default 0" ;
10             db.execSQL(sql) ;
11             Log.i("TAG", "数据库 版本升级, 1.0 --> 3.0") ;
12         }
13     }

 

3.用户使用最新版本软件后,新版本 不好用,又重新装回 旧版本 ,涉及 SQLite如何版本降级

  1).降级的设计关键点
    a、考虑云端要保存用户【自定义数据、行为习惯】。专业术语profile-->>提高用户黏度
    b、考虑[当前]的最低版本要求-->>降低维护成本
    c、尽可能本地的数据转移(所有新版本,都不删除字段)-->尽可能把未知变已知

  2). 如何降级

    1.判断版本

    2. 是否可以降级,降级中出错 如何处理

    /**
     * 该方法是在数据库版本 比以前 版本低的时候调用,就是说你的软件使用的新版本的突然觉得新版本不好用,
     * 安装 旧版本的软件
     * SQLiteDatabase :
     * oldVersion: 原来的版本
     * newVersion: 新的版本
     * */
    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        try {
            //1.修改原来表名
            String rname_sql = "alter table tb_test rename to tb_test_backup" ;
            db.execSQL(rname_sql) ;
            Log.i("TAG", "修改表名成功") ;
            
            //2.建立本版本的的表结构
            String current_sql = "create table tb_test( _id integer primary key autoincrement, name varchar(50) ,intime date)" ;
            db.execSQL(current_sql) ;
            Log.i("TAG", "建立当前版本的表结构成功") ;
            if(true){
                throw new RuntimeException("出错了") ;
            }
            // 3.数据迁移
            String copy_sql = "insert into tb_test select _id,name,intime from tb_test_backup" ;
            db.execSQL(copy_sql) ;
            Log.i("TAG", "旧表 数据 已经迁移 至 新表") ;
            
            // 4.删除 tb_test_backup 表
            String deltab_sql = "drop table tb_test_backup" ;
            db.execSQL(deltab_sql) ;
            Log.i("TAG", "旧表 成功") ;
        } catch (Exception e) {        // 如果在降级过程中出现错误
            // 1.删除旧表
            String droptab_sql = "drop table tb_test" ;
            db.execSQL(droptab_sql) ;
            Log.i("TAG", "删除表") ;
            
            // 2.重新构建新表
            String cretab_sql = "create table tb_test( _id integer primary key autoincrement, name varchar(50) ,intime date)" ;
            db.execSQL(cretab_sql) ;
            Log.i("TAG", "创建当前版本的表") ;
            
            // 3.插入初始化数据
            String insert_sql = "insert into tb_test(name,intime) values('Jack','2013-11-23')" ;
            db.execSQL(insert_sql) ;
            insert_sql = "insert into tb_test(name,intime) values('Toms','2015-01-13')" ;
            db.execSQL(insert_sql) ;
            Log.i("TAG", "插入初始化数据成功") ;
        }
    }        

 

  

 

posted @ 2016-11-30 15:42  常风  阅读(470)  评论(0编辑  收藏  举报