Android版本更新之本地数据库更新

最近上架了一个算法学习类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     }    

如此,差不多了。

原文地址:https://www.cnblogs.com/pngcui/p/4850861.html