Android数据库升级最佳方案

在android开发的时候,难免会遇上数据库审计的时候,比如在原有数据库 表中增加字段,或者新增表,这时候就面临数据库升级的操作了,
一般这时候,我们的应用是已经有了一定的用户的,我们需要保证原来的数据不会因为版本的升级而丢失.

创建数据库

Android 系统中为我们提供了SQLite的支持.同时提供了一个SQLiteOpenHelper帮助我们来创建数据库,这个类是一个抽象类,
我们需要继承并实现其中的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)";


    private Context mContext;

    public MyDatabaseHelper(Context context, String name,
            CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
        Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists Book");
        onCreate(db);
    }

}

升级数据库

在android中每一个数据库版本都对应一个版本号,当指定的版本号大于版本库版本号的时候,就会进入onUpgrade()方法
如上所示,在升级的时候 先把原来的表删除,后再重新创建.淡然这种是最糟糕的办法 ,原来的数据无法保存,
最佳的办法就是在onUpgrade()方法中根据版本号判断,来执行相应的改变即可

  • 我们需要新增一张表
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);
                    Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
                }
                @Override
                    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                    switch(oldVersion){
                        case 1:
                        db.execSQL(CREATE_CATEGORY);
                    }

                    }

这样的话,如果用户当前版本号是1,就会创建一个Category表,如果用户安装的是第二版程序的话就会两张表一起创建,当覆盖安装的时候.就会进入onUpgrade()创建一张Category表

  • 新增字段

如果要在新版中给Book表新增一个字段category_id,

public static final String CREATE_BOOK = "create table Book ("
            + "id integer primary key autoincrement, " 
            + "author text, "
            + "price real, " 
            + "pages integer, " 
            + "category_id integer, " 
            + "name text)";
            @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");
                                }

                                }

从中可以看出如果用户之前没有安装过程序就会直接创建带 category_id 的book 表

而如果是覆盖安装的话,注意这里面switch是没有break的,
如果用户是从第二版升级,那么case 2 会执行
如果用户直接从第一版升级,那么case 1 和case 2 都会执行.这样既照顾到跨版本升级的问题,也不会因为升级而丢失数据了

你可能感兴趣的:(数据库,Android开发,数据库升级方案)