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

时间:2022-09-18 23:00:00


数据的版本:
  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