Android数据库更新解释

一、何为android数据库更新

     对于android软件app来说,很多的app都需要进行产品迭代更新,对于不同的版本app来说所需要的数据库表结构可能会不同,所以在进行app的升级是需要进行数据库的更新,简单来说就是对数据库的表结构、表的数量进行更改。

二、数据库更新的方法onUpgrade

     onUpgrade方法是在数据库更新时系统调用的方法。对于软件更新来说可以简单概括为2种安装软件情况:

1、v1.0   -->  v2.0              不走onCreate,走onUpgrade

2、v2.0(直接安装v2.0)          走onCreate,不走onUpgrade

v1.0版本只有一个num表,软件版本升级到v2.0了,但是v2.0数据库需要新增一个age表,那怎么办呢?这里有2种情况了:一种是安装了v1.0升级到v2.0,这时不会走继承SQLiteOpenHelper的onCreate,而是直接走onUpgrade,这时就要在onUpgrade添加age表的代码了,在onCreate加了也没用,因为这种情况都不走onCreate。。另一种情况就是用户从来没有安装过这个软件,直接安装v2.0,这时走继承SQLiteOpenHelper的onCreate,不走onUpgrade,所以要在onCreate添加age表的代码。这怎么办呢?这就要合理升级数据库版本了。第一版本的都在onCreate,其他版本新增的在onUpgrade,而且在onCreate执行onUpgrade。做判断是否执行onUpgrade该怎么判断呢,所以有了数据库版本的概念了,DATABASE_VERSION保存当前的数据库版本,只要当前的数据库版本比已经安装的数据库版本大时,就进入onUpgrade,这时还会把上一个数据库版本号(oldVersion)跟安装的数据库版本号(newVersion)做比较,不同的DATABASE_VERSION添加自己所需要的表(跨版本升级数据库)。

   简单实例

public class DBOpenHelper extends SQLiteOpenHelper{

    private static final int VERSION = 3;
    private static final String DB_NAME = "aaa.db";
    private static DBOpenHelper mHelper = null;

    public static final String T_CITY = "city"; 
    public static final String VISA_CITY_TABLE ="city_table";
    public static synchronized DBOpenHelper getInstance(Context context) {
        if (mHelper == null) {
            mHelper = new DBOpenHelper(context.getApplicationContext());
        }
        return mHelper;
    }

    public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public DBOpenHelper(Context context, String name, int version) {
        this(context, name, null, version);
    }

    public DBOpenHelper(Context context) {
        this(context, DB_NAME, VERSION);
    }
    //创建表
    private void createAllTables(SQLiteDatabase db) {
        String sqlCity = "CREATE TABLE IF NOT EXISTS " +DBOpenHelper.T_CITY+ "(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, cn_name VARCHAR(50), cn_spell VARCHAR(50), cn_initial VARCHAR(20))";
        db.execSQL(sqlCity);
        String visaCity = "CREATE TABLE IF NOT EXISTS "+DBOpenHelper.VISA_CITY_TABLE+"(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, cn_name VARCHAR(50), cn_spell VARCHAR(50), cn_initial VARCHAR(20))";
        db.execSQL(visaCity);

        String localplay = "CREATE TABLE IF NOT EXISTS "+DBOpenHelper.LOCAL_PLAY_CITY_TABLE+"(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, cn_name VARCHAR(50), cn_spell VARCHAR(50), cn_initial VARCHAR(20))";
        db.execSQL(localplay);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        createAllTables(db);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    //根据当前版本进行数据库迭代更新
        for(int i = oldVersion; i< newVersion; i++){
            switch (i){
                case 1:
                    DBUpgradeUtils.upgradeFromVersion1To2(db);
                    break;
                case 2:
                    DBUpgradeUtils.upgradeFromVersion2To3(db);
                    break;
                default:break;
            }
        }
    }

    @Override
    public synchronized void close() {
        mHelper = null;
        super.close();
    }
}
 
 
 
 
  //更新类
  
public class DBUpgradeUtils {

    public static void upgradeFromVersion1To2(SQLiteDatabase db){
       //1版本到2版本更新方法
    }

    public static void upgradeFromVersion2To3(SQLiteDatabase db) {
      //2版本到3版本更新方法 
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值