数据库的升级原理详解
来源:互联网 发布:手机网络爸爸 编辑:程序博客网 时间:2024/04/30 04:46
Android SQLite数据库版本升级原理解析
Android使用SQLite数据库保存数据,那数据库版本升级是怎么回事呢,这里说一下。
一、软件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添加自己所需要的表(跨版本升级数据库)。
下面做一个简单的实例:
(1)、V1.0 : DATABASE_VERSION = 1000 添加一个favorite表
public
class
DBHelper
extends
SQLiteOpenHelper {
private
static
final
String DATABASE_NAME =
"mall.db"
;
private
static
final
int
DATABASE_VERSION =
1000
;
private
static
DBHelper instance =
null
;
public
DBHelper(Context context) {
super
(context, DATABASE_NAME,
null
, DATABASE_VERSION);
}
public
synchronized
static
DBHelper getInstance(Context context) {
if
(instance ==
null
) {
instance =
new
DBHelper(context);
}
return
instance;
}
@Override
public
void
onCreate(SQLiteDatabase db) {
db.execSQL(SQL.CREATE_TABLE_FAVORITE);
// 若不是第一个版本安装,直接执行数据库升级
// 请不要修改FIRST_DATABASE_VERSION的值,其为第一个数据库版本大小
final
int
FIRST_DATABASE_VERSION =
1000
;
onUpgrade(db, FIRST_DATABASE_VERSION, DATABASE_VERSION);
}
@Override
public
void
onUpgrade(SQLiteDatabase db,
int
oldVersion,
int
newVersion) {
// 使用for实现跨版本升级数据库
for
(
int
i = oldVersion; i < newVersion; i++) {
switch
(i) {
default
:
break
;
}
}
}
}
public
class
SQL {
public
static
final
String T_FAVORITE =
"favorite"
;
public
static
final
String CREATE_TABLE_FAVORITE =
"CREATE TABLE IF NOT EXISTS "
+ T_FAVORITE +
"("
+
"id VARCHAR PRIMARY KEY, "
+
"title VARCHAR, "
+
"url VARCHAR, "
+
"createDate VARCHAR "
+
")"
;
}
public
class
DBHelper
extends
SQLiteOpenHelper {
private
static
final
String DATABASE_NAME =
"mall.db"
;
private
static
final
int
DATABASE_VERSION =
1001
;
private
static
DBHelper instance =
null
;
public
DBHelper(Context context) {
super
(context, DATABASE_NAME,
null
, DATABASE_VERSION);
}
public
synchronized
static
DBHelper getInstance(Context context) {
if
(instance ==
null
) {
instance =
new
DBHelper(context);
}
return
instance;
}
@Override
public
void
onCreate(SQLiteDatabase db) {
db.execSQL(SQL.CREATE_TABLE_FAVORITE);
// 若不是第一个版本安装,直接执行数据库升级
// 请不要修改FIRST_DATABASE_VERSION的值,其为第一个数据库版本大小
final
int
FIRST_DATABASE_VERSION =
1000
;
onUpgrade(db, FIRST_DATABASE_VERSION, DATABASE_VERSION);
}
@Override
public
void
onUpgrade(SQLiteDatabase db,
int
oldVersion,
int
newVersion) {
// 使用for实现跨版本升级数据库
for
(
int
i = oldVersion; i < newVersion; i++) {
switch
(i) {
case
1000
:
upgradeToVersion1001(db);
break
;
default
:
break
;
}
}
}
private
void
upgradeToVersion1001(SQLiteDatabase db){
// favorite表新增1个字段
String sql1 =
"ALTER TABLE "
+SQL.T_FAVORITE+
" ADD COLUMN deleted VARCHAR"
;
db.execSQL(sql1);
}
}
public
class
DBHelper
extends
SQLiteOpenHelper {
private
static
final
String DATABASE_NAME =
"mall.db"
;
private
static
final
int
DATABASE_VERSION =
1002
;
private
static
DBHelper instance =
null
;
public
DBHelper(Context context) {
super
(context, DATABASE_NAME,
null
, DATABASE_VERSION);
}
public
synchronized
static
DBHelper getInstance(Context context) {
if
(instance ==
null
) {
instance =
new
DBHelper(context);
}
return
instance;
}
@Override
public
void
onCreate(SQLiteDatabase db) {
db.execSQL(SQL.CREATE_TABLE_FAVORITE);
// 若不是第一个版本安装,直接执行数据库升级
// 请不要修改FIRST_DATABASE_VERSION的值,其为第一个数据库版本大小
final
int
FIRST_DATABASE_VERSION =
1000
;
onUpgrade(db, FIRST_DATABASE_VERSION, DATABASE_VERSION);
}
@Override
public
void
onUpgrade(SQLiteDatabase db,
int
oldVersion,
int
newVersion) {
// 使用for实现跨版本升级数据库
for
(
int
i = oldVersion; i < newVersion; i++) {
switch
(i) {
case
1000
:
upgradeToVersion1001(db);
break
;
case
1001
:
upgradeToVersion1002(db);
break
;
default
:
break
;
}
}
}
private
void
upgradeToVersion1001(SQLiteDatabase db){
// favorite表新增1个字段
String sql1 =
"ALTER TABLE "
+SQL.T_FAVORITE+
" ADD COLUMN deleted VARCHAR"
;
db.execSQL(sql1);
}
private
void
upgradeToVersion1002(SQLiteDatabase db){
// favorite表新增2个字段,添加新字段只能一个字段一个字段加,sqlite有限制不予许一条语句加多个字段
String sql1 =
"ALTER TABLE "
+SQL.T_FAVORITE+
" ADD COLUMN message VARCHAR"
;
String sql2 =
"ALTER TABLE "
+SQL.T_FAVORITE+
" ADD COLUMN type VARCHAR"
;
db.execSQL(sql1);
db.execSQL(sql2);
}
}
不过这篇文章要求读者会数据库知识,但是升级数据库还有另一种做法,具体步骤见链接:
http://blog.csdn.net/crystalddd/article/details/37742021
- 数据库的升级原理详解
- Android数据库SQLite使用详解三 : 数据库的升级
- greenDAO的使用详解---(2)greenDAO3.2.2数据库的升级
- Android中SQLite的数据库版本升级详解
- 数据库索引原理详解
- 数据库索引原理详解
- Android SQLite数据库版本升级原理解析
- Android SQLite数据库版本升级原理解析
- Android SQLite数据库版本升级原理解析
- Android SQLite数据库版本升级原理解析
- Android SQLite数据库版本升级原理解析
- Android SQLite数据库版本升级原理解析
- Android SQLite数据库版本升级原理解析
- Android SQLite数据库版本升级原理解析
- Android SQLite数据库版本升级原理解析
- Android SQLite数据库版本升级原理解析
- PostgreSQL数据库的升级
- android数据库的升级
- android-BaseAdapter和getView
- 最新自然语言处理(NLP)四步流程:Embed->Encode->Attend->Predict
- Gradle多渠道打包
- 批量更改指定后辍文件权限
- PS光色与像素
- 数据库的升级原理详解
- 线上幽灵 - 笔记
- C#学习笔记1
- 图解aclocal、autoconf、automake、autoheader、configure
- 初识Android MVP(笔记)
- leetcode_效率题解_[python/C++]_21. Merge Two Sorted Lists(合并2个有序链表)
- bash: /bin/rm: 参数列表过长
- Tomcat配置及使用
- Android 中 activity 的生命周期和数据储存