sqlite升级

最近开发中遇到了需要改变项目数据库的表中字段,添加新表等需求,而又需要保证原有数据不变,这就涉及到数据库升级!现在就来总结记录一下:包含原表中增加字段,删除字段,修改字段,添加新表等四种升级操作!

SQLiteOpenHelper类中有两个方法:onCreate 和 onUpgrade,只有在第一次使用应用的时候会执行一次onCreate,之后除非把应用卸载重新安装才会重新执行onCreate,但是卸载的同时原有数据已被清除!因此,想要在改变数据库的同时保证原有数据不变,需要在onUpgrade中做逻辑处理。

具体实例:

public class Person {

    public String name;
    public int age;

    @Override
    public String toString() {
        return "name: "+name+" ,age: "+age;
    }
}

首次应用,创建数据库,并创建一张表,这时数据库版本是1

public DBHelper(Context context) {
        super(context, "person.db", null, 1);
}

    @Override
public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table user (_id integer primary key autoincrement,age Integer(20),name varchar(20))");
}

一、添加city字段
Person中添加city属性,类型String

public DBHelper(Context context) {
        super(context, "person.db", null, 2);
}

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        switch (newVersion){
            case 2://升级添加多个字段时只能一个一个添加
                String sql = "ALTER TABLE user ADD COLUMN city VARCHAR";
                db.execSQL(sql);
                break;
}

二、删除表中某个字段
删除Person中的city字段

public DBHelper(Context context) {
        super(context, "person.db", null, 3);
    }

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       switch (newVersion){
            case 3:
           /**删除表中某个字段*/
           //1.将表名改为临时表
             String sqlDrop1 = "ALTER TABLE \"user\" RENAME TO \"_User_temp_2016\";";
             db.execSQL(sqlDrop1);
          //2.创建新表(新表中没有city这个字段)
             String sqlDrop2 = "CREATE TABLE \"user\" (_id integer primary key autoincrement,sex varchar(20),name varchar(20))";
             db.execSQL(sqlDrop2);
          //3.将临时表中数据导入新表
             String sqlDrop3 = "INSERT INTO \"user\" (\"_id\",\"sex\", \"name\") SELECT \"_id\", \"age\" ,\"name\" FROM \"_User_temp_2016\";";
             db.execSQL(sqlDrop3);
          //4.更新sqlite_sequence
             String sqlDrop4 = "UPDATE \"sqlite_sequence\" SET seq = 3 WHERE name = 'user';";
             db.execSQL(sqlDrop4);
         //5.删除临时表
         String sqlDrop5 = "DROP  TABLE _User_temp_2016;";
         db.execSQL(sqlDrop5);

            //直接用下面的方法来删除字段是无效的
//   String sqlDrop = "ALTER TABLE user DROP COLUMN city";
//   db.execSQL(sqlDrop);
                break;
    }
}

三、修改字段

将Person中age字段修改为String类型的sex

public DBHelper(Context context) {
        super(context, "person.db", null, 4);
    }

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       switch (newVersion){
            case 4:
            /**修改表中原有字段*/
            //1.将表名改为临时表
                String sql1 = "ALTER TABLE \"user\" RENAME TO \"_User_old_20160909\";";
                db.execSQL(sql1);
           //2.创建新表
                String sql2 = "CREATE TABLE \"user\" (_id integer primary key autoincrement,sex varchar(20),name varchar(20),city varchar(20))";
                db.execSQL(sql2);
           //3.将临时表中数据导入新表
              String sql3 = "INSERT INTO \"user\" (\"_id\",\"sex\", \"name\",\"city\") SELECT \"_id\", \"age\" ,\"name\",\"city\" FROM \"_User_old_20160909\";";
                db.execSQL(sql3);
          //4.更新sqlite_sequence
            String sql4 = "UPDATE \"sqlite_sequence\" SET seq = 3 WHERE name = 'user';";
                db.execSQL(sql4);
                /**
                 * 由于在Sqlite中使用自增长字段,引擎会自动产生一个sqlite_sequence表,用于记录每个表的自增长字段的已使用的最大值,所以要一起更新下。如果有没有设置自增长,则跳过此步骤。
                 * */

           //5.删除临时表(这一步可以做,也可以不做)
      String sql5 = "DROP  TABLE _User_old_20160909;";
      db.execSQL(sql5);
          break;
    }
}

四、添加新表

public DBHelper(Context context) {
        super(context, "person.db", null, 5);
    }

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       switch (newVersion){
       case 5:
     //添加一张表
    db.execSQL("create table person (_id integer primary key autoincrement,age Integer(20),name varchar(20),city varchar(20))");

                break;
       }
}

好了,暂时就到这里了!未完待续…..

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值