Android数据库更新并保留原来数据的实现

今天公司突然说要在原来的表基础上加一个字段、因为之前木有搞过啊·~百度了一下资料,发现也不算很难实现!
所以做了一个简单的demo ,防止以后忘记啦~~~

package cn.view.database;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;

public class DBHelper extends SQLiteOpenHelper {

    public  static final String TABLE="sky";
    private   String TEMP_TABLES="_temp_sky";
    String newsql = "CREATE TABLE " + TABLE + "(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
            Column.ACCOUNT + " TEXT, " +
            Column.NICKNAME + " TEXT, " +
            Column.AVATAR + " TEXT, " +
            Column.PINYIN + " TEXT, " +
            Column.SEX + " TEXT);";
    public class Column implements BaseColumns{
        public static final String ACCOUNT = "account";//账号
        public static final String NICKNAME = "nickname";//昵称
        public static final String AVATAR = "avatar";//头像
        public static final String PINYIN = "pinyin";//账号拼音
        public static final String SEX = "sex";//账号拼音
    }
    /**
     * 
     * 需求 更新一个个人信息的 sex 字段  \同时之前的数据保留
     * 
     * @param context
     */
    // 1. 将表名改为临时表     ALTER  table Subscription RENAME TO __temp__Subscription;
    private String CREATE_TEMP_TABLE="alter table "+TABLE+" rename to "+TEMP_TABLES;
    //2 创建新表     CREATE TABLE Subscription (OrderId VARCHAR(32) PRIMARY KEY ,UserName VARCHAR(32) NOT NULL ,ProductId VARCHAR(16) NOT NULL);
    private String CREATE_TABLE= newsql;
    //3 插入旧数据
    private String INSERT_DATA= "insert into "+TABLE+" select *,'' from  "+TEMP_TABLES;
    //4 删除临时表
    private String DROP_TEMP_TABLE = "drop table "+TEMP_TABLES;

    public DBHelper(Context context) {
        super(context, TABLE, null, 3);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE " + TABLE + "(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                Column.ACCOUNT + " TEXT, " +
                Column.NICKNAME + " TEXT, " +
                Column.AVATAR + " TEXT, " +
                Column.PINYIN + " TEXT);";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        System.out.println("oldVersion  "+oldVersion +" newVersion "+newVersion);
        switch (newVersion) {

          case 3:
           db.execSQL(CREATE_TEMP_TABLE);
           db.execSQL(CREATE_TABLE);
           db.execSQL(INSERT_DATA);
           db.execSQL(DROP_TEMP_TABLE);
           break;
          }
    } 
}

注意:这里的构造函数可以看到一个参数 version
这里本来是调用的时候写进来的

public DBHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
    }

但是 一般我们会自己实现一个新的构造函数

    public DBHelper(Context context) {
        super(context, TABLE, null, 1);

    }

这里的1 就是 version,所以如果要代码run到

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        System.out.println("oldVersion  "+oldVersion +" newVersion "+newVersion);
        switch (newVersion) {

          case 2:
           db.execSQL(CREATE_TEMP_TABLE);
           db.execSQL(CREATE_TABLE);
           db.execSQL(INSERT_DATA);
           db.execSQL(DROP_TEMP_TABLE);
           break;
          }
    } 

就必须要修改version ,让它和newVersion 一致。

因为之前不注意、搞了好一阵子················

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值