Android数据库升级,【原理+实战+视频+源码

本文介绍了Android数据库升级的处理方式,通过SQLiteOpenHelper的onCreate和onUpgrade方法管理数据库版本变化。例如,从v1.0到v2.0新增表member,再到v3.0新增表news,通过数据库版本号判断升级路径。示例代码展示了如何在不同版本间进行表结构调整,以及如何使用for循环处理跨版本升级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面看一个软件的升级的例子


  1. 软件v1.0

安装v1.0,假设1.0版本只有一个account表,这时继续走SQLiteOpenHelper的onCreate,不走onUpgrade

  1. 软件v2.0

有两种安装软件的情况:

1)v1.0 --> v2.0 不走onCreate,执行onUpgrade

2)v2.0 (直接安装)直接onCreate

v1.0只有一个account表,软件升级到2.0需要新增一个member表,有两个方法,一是在onUpgrade中添加member方法,另一种就是用户从来没有安装这个软件,直接安装v2.0,这时走onCreate。

  1. 软件v3.0

假设v3.0又新增一个news表,这里有三种情况:

1)v1.0 --> v3.0 不走onCreate ,走onUpgrade

2)v2.0 --> v3.0 不走onCreate,走onUpgrade

3)v3.0(直接安装) 直接onCreate

那么数据库添加表语句在哪里写呢?数据库有一个版本号DATABASE_VERSION表示,其实就是要么在onCreate中要么就在onUpgrade中添加,下面有一种做法

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。

通过数据库版本号来判断要不要Upgrade,如果当前的DATABASE_VERSION比安装数据库的版本号大的时候,就会进入onUpgrade。

下列是一个例子:来自传送门

(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;

}

}

}

}

其中的SQL的建表语句为:

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 " +

“)”;

}

(2)v2.0:DATABASE_VERSION=1001,在favor

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

ite表添加1个deleted字段

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;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值