OrmLite数据库升级

    在应用开发过程中,随着需求的不断变化,难免会修改数据库,或是增加一张表,或是增加一个字段。这就需要对数据库进行升级,我们只要升级数据库的版本号,那么下次使用时就会自动调用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<Person, Integer> 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。

源码地址

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值