今天公司突然说要在原来的表基础上加一个字段、因为之前木有搞过啊·~百度了一下资料,发现也不算很难实现!
所以做了一个简单的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 一致。
因为之前不注意、搞了好一阵子················