关于Android数据库的升级

增加表

1.在onCreate新建Category表,这种方法需要用户卸载老版本再安装新版的程序;(不可取)软件卸载造成老数据的丢失。

public class MyDatabaseHelper extends SQLiteOpenHelper {

    public static final String CREATE_BOOK = "create table Book ("
            + "id integer primary key autoincrement, "
            + "author text, "
            + "price real, "
            + "pages integer, "
            + "name text)";

    public static final String CREATE_CATEGORY = "create table Category ("
            + "id integer primary key autoincrement, "
            + "category_name text, "
            + "category_code integer)";

----------省略
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
        db.execSQL(CREATE_CATEGORY);
    }
-----------省略
}
  1. 升级版本号,触发onUpgrade()方法,然后删除存在的表,再建表。(不可取)原因也是会造成数据的丢失。
----------
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists Book");
        db.execSQL("drop table if exists Category");
        onCreate(db);
    }
---------

3.升级版本号,在onUpgrade只创建新表如下:

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion ==1) {
            db.execSQL(CREATE_CATEGORY);
          }
    }

修改表定义

比如Category表添加pageNo字段。

SQLite数库对ALTER TABLE命令支持非常有限,只能在表末尾添加列,不能修改列定义,不能删除已有的列。我们可以采用临时表的办法。具体来说有四步:

*将现有表重命名为临时表;
*创建新表;
*将临时表的数据导入新表(注意处理修改的列);
*删除临时表。

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        switch (oldVersion) {
            case 1:
            //如果老版本是1,则新建Category表,即增加表的3方法
            createCategoryTable(db);
            case 2:
            //如果老版本是2,
            db.execSQL("ALTER TABLE Category RENAME TO Category_temp");
            db.execSQL("CREATE TABLE Category(id integer primary key autoincrement,"
                 + "category_name text, "
                 +"category_code integer"
                 + "pageNo integer)");
            db.execSQL("insert into Category(id, category_name, category_code, pageNo) " 
                + "select id, category_name, category_code, 100 from Category_temp");
            db.execSQL("DROP TABLE Category_temp");
                break;
        }
    }

推荐阅读更多精彩内容

  • 前言 本文参考转发摘自:【郭霖博客】http://blog.csdn.net/guolin_blog?viewmo...
    _猜火车_阅读 3,882评论 0 9
  • 姓名:沈丹萍 公司:宁波大发化纤有限公司 《六项精进》289期学员 组名:反省二组 【日精进打卡129天】 【知~...
    好运到来阅读 15评论 0 0
  • 笔者闲翻朋友圈,偶见前同事发布一语:核桃的前半生,但却是这些老乡们的后半生。一眼便喜欢上了这句话,多有人情味!我点...
    忘路人阅读 68评论 0 1
  • 早就听说阿里巴巴有一个叫“余额宝”的产品,说是“年化收益率”可以达到5%。可能关注理财产品的都知道“年化收益率”的...
    何必阅读 90评论 0 1
  • 去年底微信推出了第二本官方丛书-《微信力量》,如果第一本《微信思维》仅仅还是思维上的入门与引导,那么这一本就是展示...
    托爸阅读 139评论 0 0