android 数据库升级

 

数据库版本升级

          在开发android应用程序的时候,一般由于在我们开发的时候我们不知道以后会后什么新功能,也有可能增加业务逻辑(也就是更新),可想而知我们原来的数据库结构可能不适用已更新的应用,那么应用在读取旧数据的时候可能就会出现问题;解决上面问题的方法有如下两种:
  1.卸载旧版本,安装新的应用程序
            备注:这样做有一点不好就是原来的数据就丢失了;

@Override
2     public void onUpgrade(SQLiteDatabase db, int oldVersion, int oldVersion) {
3       if(oldVersion!=oldVersion){
            dropAll(db);
            //在重新创建新的数据库就可以了
              createTables();具体的实现自己实现
        }

7     }

   2.软件自行更新数据库结构(接下来就介绍软件自行更新方法)
   

    首先我们新建一个项目并初始化数据库(此时数据库版本为1.0)

 public class myDatabase extends SQLiteOpenHelper{
11     
12     public static final String CREATE_BOOK = "***.***.db";
       public static final String ALT_SMS_TABLE ="alter table sms rename to sms_tmp";
       public static final String DROP_SMS_TEMP ="DROP TABLE IF EXISTS sms_tmp";
       public static final String SMS_TEMP = "sms_tmp";
       public static final String SMS = "sms";
       public static final String
18     
19     private Context mContext;
20     
21 
22     public myDatabase(Context context) {
23         super(context, CREATE_BOOK, null, 1);  //数据库版本为1   
24         mContext = context;
25         }
26     
27     
28     /*数据库第一次创建时调用,适合用于初始化,创建表 当数据库已存在则不调用该方法*/

29     @Override
30     public void onCreate(SQLiteDatabase db) {
31         db.execSQL(CREATE_BOOK);

35     }
36     
37     @Override
38     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
39        //
            db.beginTarnsaction();
            db.execSQL(ALT_SMS_TABLE);
            createSmsTables(db);
            //拷贝备份的到新的表中
            copySmsTable(db);
            //删除备份表中
            db.execSQL(DROP_SMS_TEMP);
            db.endTransaction();

40     }
41     
42 }

 

拷贝数据到新的表中方法:

private void copySmsTable(SQLiteDatebase db){

Cursor sms = db.rawQuery("PRAGMA table_info("+SMS_TMP+"),null");
if(sms!=null&&sms.getCount!=0){
   String[]columnNames = new String[sms.getCount()];
   int columnIndex = sms.getColumnIndex("name");
   if(columnIndex==-1){
       return;
   }
    int index = 0;
    for(sms.moveToFirst();!sms.isAfterLast();sms.moveToNext()){
       columnNames[index] = sms.getString(columnIndex);
       index++;
    }
    String columns = Arrays.toString(columnNames);
    columns = columns.substring(1,columns.length()-1);
    String sql = "INSERT INTO"+SMS+"("+columns+")"+"SELECT"+columns+"FROM"+SMS_TMP;
    db.execSQL(sql);
    sms.close();
    
    }

}

 

 

 

 

降级的设计关键点

@Override
 2     public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        //这个方法必须实现  不然后面不能再降级
        //哪怕这个方法里面没有实现,可以后面需要的话,再继续实现               
                
        
     }

参考链接  在此特别鸣谢:

         https://blog.csdn.net/leehong2005/article/details/9128501s

         https://www.cnblogs.com/wenjiang/p/4557196.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值