关于数据库迭代更新

来源:互联网 发布:股票软件的数据接口 编辑:程序博客网 时间:2024/05/21 21:18

App在进行版本更新的同时,我们可能需要对数据库版本进行相应的更新。接下来介绍数据库更新的一些方法:

方法来自郭大神的第一行代码。

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 MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) {        super(context, name, factory, version);    }    @Override    public void onCreate(SQLiteDatabase db) {        db.execSQL(CREATE_BOOK);    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }}

OK,上面是第一版,只是简单的建了一张数据表。
第二版本我们需要新增一张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)";    public MyDatabaseHelper(Context context, String name,CursorFactory factory, int version) {        super(context, name, factory, version);    }    @Override    public void onCreate(SQLiteDatabase db) {        db.execSQL(CREATE_BOOK);        db.execSQL(CREATE_CATEGORY);    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        switch (oldVersion) {            case 1:                db.execSQL(CREATE_CATEGORY);            default:        }    }}

上面代码的效果,如果客户第一次安装我们的程序,那么会执行onCreate中两个sql语句;如果客户是在第一版的基础上更新应用程序,那么应用程序会执行onUpgrade方法,如果之前的版本号是1,那么就会新增数据表。

ps:onCreate中的方法只会执行一次,所以必须依赖onUpgrade方法进行数据库的迭代

第三版,需要上面两个表建立关联关系,

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, "        + "category_id integer)";//新增的字段    public static final String CREATE_CATEGORY = "create table Category ("        + "id integer primary key autoincrement, "        + "category_name text, "        + "category_code integer)";    public MyDatabaseHelper(Context context, String name,CursorFactory factory, int version) {        super(context, name, factory, version);    }    @Override    public void onCreate(SQLiteDatabase db) {        db.execSQL(CREATE_BOOK);        db.execSQL(CREATE_CATEGORY);    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        switch (oldVersion) {            case 1:                db.execSQL(CREATE_CATEGORY);            case 2:                db.execSQL("alter table Book add column category_id integer");            default:        }    }}

ok,如果新用户,会直接创建两张表;
如果是第一版的老用户,直接更新到第三版,那么会执行onUpgrade中的两个方法,先创建CREATE_CATEGORY表,然后修改Book表,这也是为什么case后面不加break的原因;
如果是第二版的老用户,会执行onUpgrade中的case 2

ok,这样我们就可以合理的管理数据库的迭代了!!!

0 0