在应用开发过程中,随着需求的不断变化,难免会修改数据库,或是增加一张表,或是增加一个字段。这就需要对数据库进行升级,我们只要升级数据库的版本号,那么下次使用时就会自动调用onUpgrade方法,当然具体的修改需要我们自己来实现。
最简单粗暴的方法就是将原来的表全部删除,然后重新创建,之前的代码示例中就是这么做的。
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
// TODO Auto-generated method stub
try {
TableUtils.createTable(connectionSource, Student.class);
TableUtils.createTable(connectionSource, Profession.class);
TableUtils.createTable(connectionSource, Worker.class);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
try {
TableUtils.dropTable(connectionSource, Student.class, true);
TableUtils.dropTable(connectionSource, Profession.class, true);
TableUtils.dropTable(connectionSource, Worker.class, true);
onCreate(database, connectionSource);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这样做的好处呢就是简单,不容易出现问题,但是会导致用户数据丢失,体验就比较差了,最好是针对数据库的变化做相应的升级处理。
以下代码在http://blog.csdn.net/dingfengnupt88/article/details/52129439基础上修改。
增加一张表
当前数据库版本为1,现在要增加一张表"table_person",首先创建Person实体类,
@DatabaseTable(tableName = "table_person")
public class Person {
@DatabaseField(generatedId = true)
public int id;
@DatabaseField(columnName = "name")
public String name;
@DatabaseField(columnName = "age")
public int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
数据库版本号升级为2,
// Database Version
private static final int DB_VERSION = 2;
下次使用数据库时就会执行onUpgrade方法,传递了三个参数,此时oldVersion值为1,newVersion值为2,我们可以据此判断以做出相应的处理,
if (newVersion == 2) {
try {
TableUtils.createTable(connectionSource, Person.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
一定要在此处添加,不能再onCreate中处理,之前也提到过,onCreate的方法只有在第一次创建数据库中才调用,当然也可以手动调用,但即使手动调用,也必须在onUpgrade方法中。
这样数据库中就增加了一张表。
还要在Helper类中添加mPersonDao。
public BaseDao getPersonDao() {
if (mPersonDao == null) {
mPersonDao = new BaseDaoImpl<>(mContext, Person.class);
}
return mPersonDao;
}
向新建的表里插入一条记录,测试这张表是否创建成功。
private void add() {
Person p = new Person("Tom", 23);
Helper.getInstance().getPersonDao().insert(p);
Utils.copyDBToSDcrad();
}
成功插入了一条数据,说明这张表创建成功。
表中添加一个字段
基本步骤与添加表差不多,也是升级版本号,在onUpgrade中处理。
在Person实体类添加一个新的字段,
@DatabaseField(columnName = "sex")
public int sex;
数据库版本号升级到3,
// Database Version
private static final int DB_VERSION = 3;
在onUpgrade方法中使用sqlite语句插入这个字段,
if (newVersion == 3) {
try {
getDao(Person.class).executeRaw("ALTER TABLE `table_person` ADD COLUMN sex INTEGER DEFAULT 0;");
Helper.getInstance().reset();
} catch (SQLException e) {
e.printStackTrace();
}
}
添加完字段后,需要重新生成Dao对象,否则有可能使用之前生成的,导致数据库操作失败。
public void reset() {
mStudentDao = new BaseDaoImpl<>(mContext, Student.class);
mProfessionDao = new BaseDaoImpl<>(mContext, Profession.class);
mWorkerDao = new BaseDaoImpl<>(mContext, Worker.class);
mPersonDao = new BaseDaoImpl<>(mContext, Person.class);
}
测试一下,
private void add() {
// Person p = new Person("Tom", 23);
// Helper.getInstance().getPersonDao().insert(p);
Person p = new Person("Jack", 25, 1);
Helper.getInstance().getPersonDao().insert(p);
Utils.copyDBToSDcrad();
}
新增的字段成功添加了,并且默认值为0。
源码地址