最近上架了一个算法学习类APP,在更新应用版本时,发现数据库依旧没有更新,还是上一个版本的数据内容,遂把这方面的内容记录下来。
PS:本人处女作APP 《算法之家》 可以在豌豆荚、360手机助手、腾讯应用宝中下载安装~
如下是父类的构造函数,所有的数据库都是继承这个父类的。
1 public MyOpenHelper(Context context, String name, CursorFactory factory, 2 int version) { 3 super(context, name, factory, version); 4 // TODO Auto-generated constructor stub 5 } 6 7 //笔记 8 public MyOpenHelper(Context context, String name) { 9 super(context, name,null,VERSION); 10 // TODO Auto-generated constructor stub 11 } 12 13 public MyOpenHelper(Context context) { 14 super(context, null,null,mVERSION); 15 // TODO Auto-generated constructor stub 16 } 17 18 public MyOpenHelper(Context context, String name,int version) { 19 super(context, name, null, version); 20 // TODO Auto-generated constructor stub 21 } 22 23 @Override 24 public void onCreate(SQLiteDatabase db) { 25 // TODO Auto-generated method stub 26 27 } 28 29 @Override 30 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 31 // TODO Auto-generated method stub 32 33 }
1、当我们使用new MyOpenHelper(context)去构造的时候,会经常性的执行子类中public void onCreate(SQLiteDatabase db)这个方法,因此这样可以不用更新,但是使用这样的方式去构造的数据库,用户不能update,不能insert,只能在构造的时候insert。。
2、当我们使用new MyOpenHelper(context,name)去构造的时候,只会执行一次子类中的onCreate方法,也就是说如果我们在以后升级应用时,想要更新此数据库中的内容,需要另寻他法,所以数据库的版本的重要性就体现出来了,也就是super(context, name,null,VERSION);的VERSION关键字,当系统发现该数据库版本比原应用的数据库版本高,则会自动调用onUpgrade方法,所以有了如下代码。
1 @Override 2 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 3 // TODO Auto-generated method stub 4 5 switch(oldVersion){ 6 case 1: 7 Version2(db); 8 break; 9 case 2: 10 Version3(db); 11 break; 12 case 3: 13 break; 14 case 4: 15 break; 16 default: 17 System.out.println("default"); 18 break; 19 20 }
比如原数据库版本为1,此时就会执行case 1:的指令。
在修改数据库中需要添加这样几行代码
1 private void Version2(SQLiteDatabase db) { 2 // TODO Auto-generated method stub 3 4 db.beginTransaction(); 5 6 //改名数据库表 7 db.execSQL("alter table TABLE1 rename to TABLE2"); 8 9 //新建表单 10 db.execSQL("create table TABLE1(XX,XX)"); 11 12 //插入原有的数据 13 db.execSQL("insert into TABLE select * from TABLE2"); 14 //如果增加了列属性,则使用双引号”” 来补充原来不存在的数据 15 16 //删除临时表单 17 db.execSQL("drop table TABLE2"); 18 19 db.setTransactionSuccessful(); 20 db.endTransaction(); 21 22 }
如此,差不多了。