关于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;
        }
    }

你可能感兴趣的:(关于Android数据库的升级)