Android 数据库升级 数据迁移 数据不丢失



数据的版本:

  1. private static final String DBNAME = "ads.db";  
  2. private static final int VERSION = 1;  
  3.   
  4. public DBOpenHelper(Context context) {  
  5.     super(context, DBNAME, null, VERSION);  
  6. }  


一、软件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()方法的实现如下:


  1.        // Pattern for upgrade blocks:  
  2. //  
  3. //    if (upgradeVersion == [the DATABASE_VERSION you set] - 1){  
  4. //        .. your upgrade logic..  
  5. //        upgradeVersion = [the DATABASE_VERSION you set]  
  6. //    }  
  7.   
  8.   
  9. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)  
  10. {  
  11.     int upgradeVersion  = oldVersion;  
  12.   
  13.     if (18 == upgradeVersion) {  
  14.         // Create table C  
  15.         String sql = "CREATE TABLE ...";  
  16.         db.execSQL(sql);  
  17.         upgradeVersion = 19;  
  18.     }  
  19.   
  20.     if (20 == upgradeVersion) {  
  21.         // Modify table C  
  22.         upgradeVersion = 20;  
  23.     }  
  24.   
  25.     if (upgradeVersion != newVersion) {  
  26.         // Drop tables  
  27.         db.execSQL("DROP TABLE IF EXISTS " + tableName);  
  28.         // Create tables  
  29.         onCreate(db);  
  30.     }  
  31. }  



参考博客“
http://blog.csdn.net/jiangwei0910410003/article/details/39670813

http://www.cnblogs.com/liqw/p/4264925.html

数据的版本:

  1. private static final String DBNAME = "ads.db";  
  2. private static final int VERSION = 1;  
  3.   
  4. public DBOpenHelper(Context context) {  
  5.     super(context, DBNAME, null, VERSION);  
  6. }  


一、软件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()方法的实现如下:


  1.        // Pattern for upgrade blocks:  
  2. //  
  3. //    if (upgradeVersion == [the DATABASE_VERSION you set] - 1){  
  4. //        .. your upgrade logic..  
  5. //        upgradeVersion = [the DATABASE_VERSION you set]  
  6. //    }  
  7.   
  8.   
  9. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)  
  10. {  
  11.     int upgradeVersion  = oldVersion;  
  12.   
  13.     if (18 == upgradeVersion) {  
  14.         // Create table C  
  15.         String sql = "CREATE TABLE ...";  
  16.         db.execSQL(sql);  
  17.         upgradeVersion = 19;  
  18.     }  
  19.   
  20.     if (20 == upgradeVersion) {  
  21.         // Modify table C  
  22.         upgradeVersion = 20;  
  23.     }  
  24.   
  25.     if (upgradeVersion != newVersion) {  
  26.         // Drop tables  
  27.         db.execSQL("DROP TABLE IF EXISTS " + tableName);  
  28.         // Create tables  
  29.         onCreate(db);  
  30.     }  
  31. }  



参考博客“
http://blog.csdn.net/jiangwei0910410003/article/details/39670813

http://www.cnblogs.com/liqw/p/4264925.html



你可能感兴趣的:(android)