数据的版本:
- private static final String DBNAME = "ads.db";
- private static final int VERSION = 1;
- public DBOpenHelper(Context context) {
- super(context, DBNAME, null, VERSION);
- }
一、软件v1.0 安装v1.0,假设v1.0版本只有一个account表,这时走继承SQLiteOpenHelper的onCreate,不走onUpgrade。 1、v1.0(直接安装v1.0) 二、软件v2.0 有2种安装软件情况: 1、v1.0 --> v2.0 不走onCreate,走onUpgrade 2、v2.0(直接安装v2.0) 走onCreate,不走onUpgrade v1.0版本只有一个account表,软件版本升级到v2.0了,但是v2.0数据库需要新增一个member表,那怎么办呢?这里有2种情况了:一种是安装了v1.0升级到v2.0,这时不会走继承SQLiteOpenHelper的onCreate,而是直接走onUpgrade,这时就要在onUpgrade添加member表的代码了,在onCreate加了也没用,因为这种情况都不走onCreate。另一种情况就是用户从来没有安装过这个软件,直接安装v2.0,这时走继承SQLiteOpenHelper的onCreate,不走onUpgrade,所以要在onCreate添加member表的代码。这怎么办呢?这就要合理升级数据库版本了。 三、软件v3.0 假设v3.0又新增一个news表,这里有三种情况: 1、v1.0 --> v3.0 不走onCreate,走onUpgrade 2、v2.0 --> v3.0 不走onCreate,走onUpgrade 3、v3.0(直接安装v3.0) 走onCreate,不走onUpgrade 那数据库添加表语句在那里写呢?数据库有一个版本号用DATABASE_VERSION表示 其实想一下,就知道不是onCreate写就是onUpgrade写,就是要兼容各种情况下安装app,都能把数据库表添加进去就好了。这里很巧妙: 1、v1.0 DATABASE_VERSION=1000 onCreate --添加-- account 2、v2.0 DATABASE_VERSION=1001 onCreate --添加-- account (v1.0代码不变) onUpgrade(DATABASE_VERSION>1000) onUpgrade --添加-- member 3、v3.0 DATABASE_VERSION=1002 onCreate --添加-- account (v1.0代码不变) onUpgrade(DATABASE_VERSION>1001) onUpgrade --添加-- member (v2.0代码不变) onUpgrade --添加-- news 这样就可以解决问题了,第一版本的都在onCreate,其他版本新增的在onUpgrade,而且在onCreate执行onUpgrade。做判断是否执行onUpgrade该怎么判断呢,所以有了数据库版本的概念了,DATABASE_VERSION保存当前的数据库版本,只要当前的数据库版本比已经安装的数据库版本大时,就进入onUpgrade,这时还会把上一个数据库版本号(oldVersion)跟安装的数据库版本号(newVersion)做比较,不同的DATABASE_VERSION添加自己所需要的表(跨版本升级数据库)
场景一: 在数据库升级时,不同版本的数据库,他们定义的表结构完全可能是不一样的,比如V1.0的表A有10个column,而在V1.1的表A有12个colum,在升级时,表A增加了两列,此时我们应该怎么做呢。
总体思路 1,将表A重命名,改了A_temp。 2,创建新表A。 3,将表A_temp的数据插入到表A
场景二:(新增表或者新增字段)
数据库的每一个版本所代表的数据库必须是定义好的,比如说V18的数据库,它可能只有两张表TableA和TableB,如果V19要添加一张表TableC,如果V20要修改TableC,那么每一个版本所对应的数据库结构如下:
V18 ---> TableA, TableB
V19 ---> TableA, TableB, TableC
V20 ---> TableA, TableB, TableC (变更)
分析:V18-----V20,自己添加一个表
V19-------------V20, 添加了一个字段,需要用到场景一的方式
onUpgrade()方法的实现如下:
- // Pattern for upgrade blocks:
- //
- // if (upgradeVersion == [the DATABASE_VERSION you set] - 1){
- // .. your upgrade logic..
- // upgradeVersion = [the DATABASE_VERSION you set]
- // }
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
- {
- int upgradeVersion = oldVersion;
- if (18 == upgradeVersion) {
- // Create table C
- String sql = "CREATE TABLE ...";
- db.execSQL(sql);
- upgradeVersion = 19;
- }
- if (20 == upgradeVersion) {
- // Modify table C
- upgradeVersion = 20;
- }
- if (upgradeVersion != newVersion) {
- // Drop tables
- db.execSQL("DROP TABLE IF EXISTS " + tableName);
- // Create tables
- onCreate(db);
- }
- }
参考博客“ http://blog.csdn.net/jiangwei0910410003/article/details/39670813
http://www.cnblogs.com/liqw/p/4264925.html
数据的版本:
- private static final String DBNAME = "ads.db";
- private static final int VERSION = 1;
- public DBOpenHelper(Context context) {
- super(context, DBNAME, null, VERSION);
- }
一、软件v1.0 安装v1.0,假设v1.0版本只有一个account表,这时走继承SQLiteOpenHelper的onCreate,不走onUpgrade。 1、v1.0(直接安装v1.0) 二、软件v2.0 有2种安装软件情况: 1、v1.0 --> v2.0 不走onCreate,走onUpgrade 2、v2.0(直接安装v2.0) 走onCreate,不走onUpgrade v1.0版本只有一个account表,软件版本升级到v2.0了,但是v2.0数据库需要新增一个member表,那怎么办呢?这里有2种情况了:一种是安装了v1.0升级到v2.0,这时不会走继承SQLiteOpenHelper的onCreate,而是直接走onUpgrade,这时就要在onUpgrade添加member表的代码了,在onCreate加了也没用,因为这种情况都不走onCreate。另一种情况就是用户从来没有安装过这个软件,直接安装v2.0,这时走继承SQLiteOpenHelper的onCreate,不走onUpgrade,所以要在onCreate添加member表的代码。这怎么办呢?这就要合理升级数据库版本了。 三、软件v3.0 假设v3.0又新增一个news表,这里有三种情况: 1、v1.0 --> v3.0 不走onCreate,走onUpgrade 2、v2.0 --> v3.0 不走onCreate,走onUpgrade 3、v3.0(直接安装v3.0) 走onCreate,不走onUpgrade 那数据库添加表语句在那里写呢?数据库有一个版本号用DATABASE_VERSION表示 其实想一下,就知道不是onCreate写就是onUpgrade写,就是要兼容各种情况下安装app,都能把数据库表添加进去就好了。这里很巧妙: 1、v1.0 DATABASE_VERSION=1000 onCreate --添加-- account 2、v2.0 DATABASE_VERSION=1001 onCreate --添加-- account (v1.0代码不变) onUpgrade(DATABASE_VERSION>1000) onUpgrade --添加-- member 3、v3.0 DATABASE_VERSION=1002 onCreate --添加-- account (v1.0代码不变) onUpgrade(DATABASE_VERSION>1001) onUpgrade --添加-- member (v2.0代码不变) onUpgrade --添加-- news 这样就可以解决问题了,第一版本的都在onCreate,其他版本新增的在onUpgrade,而且在onCreate执行onUpgrade。做判断是否执行onUpgrade该怎么判断呢,所以有了数据库版本的概念了,DATABASE_VERSION保存当前的数据库版本,只要当前的数据库版本比已经安装的数据库版本大时,就进入onUpgrade,这时还会把上一个数据库版本号(oldVersion)跟安装的数据库版本号(newVersion)做比较,不同的DATABASE_VERSION添加自己所需要的表(跨版本升级数据库)
场景一:在数据库升级时,不同版本的数据库,他们定义的表结构完全可能是不一样的,比如V1.0的表A有10个column,而在V1.1的表A有12个colum,在升级时,表A增加了两列,此时我们应该怎么做呢。
总体思路 1,将表A重命名,改了A_temp。 2,创建新表A。 3,将表A_temp的数据插入到表A
场景二:(新增表或者新增字段)
数据库的每一个版本所代表的数据库必须是定义好的,比如说V18的数据库,它可能只有两张表TableA和TableB,如果V19要添加一张表TableC,如果V20要修改TableC,那么每一个版本所对应的数据库结构如下:
V18 ---> TableA, TableB
V19 ---> TableA, TableB, TableC
V20 ---> TableA, TableB, TableC (变更)
分析:V18-----V20,自己添加一个表
V19-------------V20, 添加了一个字段,需要用到场景一的方式
onUpgrade()方法的实现如下:
- // Pattern for upgrade blocks:
- //
- // if (upgradeVersion == [the DATABASE_VERSION you set] - 1){
- // .. your upgrade logic..
- // upgradeVersion = [the DATABASE_VERSION you set]
- // }
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
- {
- int upgradeVersion = oldVersion;
- if (18 == upgradeVersion) {
- // Create table C
- String sql = "CREATE TABLE ...";
- db.execSQL(sql);
- upgradeVersion = 19;
- }
- if (20 == upgradeVersion) {
- // Modify table C
- upgradeVersion = 20;
- }
- if (upgradeVersion != newVersion) {
- // Drop tables
- db.execSQL("DROP TABLE IF EXISTS " + tableName);
- // Create tables
- onCreate(db);
- }
- }
参考博客“http://blog.csdn.net/jiangwei0910410003/article/details/39670813
http://www.cnblogs.com/liqw/p/4264925.html