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", "插入初始化数据成功") ; } }