数据库实现方法中有必须继承两个方法:onCreate和onUpgrade,他们的调用过程如下:
1.如果数据库文件不存在,SQLiteOpenHelper在自动创建数据库后只会调用onCreate方法,在该方法中一般需要创建数据库中的表、视图等组件。在创建之前,数据库是空的,因此,不需要先删除数据库中相关的组件。
2.如果数据库文件存在,并且当前的版本号高于上次创建或升级时的版本号,SQLiteOpenHelper会调用onUpgrade方法,调用该方法后,会更新数据库版本号。在onUpgrade方法中除了创建表、视图等组件外,还需要首先删除这些相关的组件,因此,在调用onUpgrade方法之前,数据库是存在的,里面还有很多数据库组件。
3.综合上述两点,可以得出一个结论。如果数据库文件不存在,只有onCreate方法被调用(该方法只会在创建数据库时被调用1次)。如果数据库文件存在,并且当前版本较高,会调用onUpgrade方法来升级数据库,并更新版本号。
关于应用程序更新时版本号的升级,我引用别人的场景:
引用
我这里说的数据库版本指的是:我们的应用的程序的数据库的用户版本(user_version).比如说下面的情形:
2013年4月,我们第一次 发布了 我们的应用,数据库版本是1。
2013年5月,我们第二次 发布了 我们的应用,数据库版本是2。由于业务需要,我们更改了数据库里的某个表的表结构。
这时候就有这样的难题出现:
有些用户已经下载了4月份的版本1,并且已经使用了,很多数据存储在数据库了,这个时候,他想安装新的版本2,怎么办? 怎么才能让数据不丢失?
有的用户直接装了5月份的版本,那这些用户就直接使用了新的表结构格式。
可能以后还有版本3,4,N,怎么保证“数据不丢失的情况下“让用户手机里的数据库跟着升级?
------
我们记得SQLiteOpenHelper的onUpgrade方法,那么它是如何工作呢?我们该如何使用他?下面先说说使用它的方式。
解决方案:
我们在4月份数据库建立时,使用下面的方式
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "mydata.db"; // 数据库名称
private static final int version = 1; // 数据库版本
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table user(id integer primary key autoincrement , username varchar(20), password varchar(60));";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
于是到了五月份,由于业务需要,我们想添加新的字段到这个表里。我们这样写代码:
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "mydata.db"; // 数据库名称
private static final int version = 2; // 数据库版本
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table user(id integer primary key autoincrement , username varchar(20), password varchar(60));";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion == 1 && newVersion == 2) {
// 从版本1到版本2时,增加了一个字段 desc
String sql = "alter table [user] add [desc] nvarchar(300)";
db.execSQL(sql);
}
}
}
如果数据库结构变化比较大,要做彻底的升级,怎么办?
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "mydata.db"; // 数据库名称
private static final int version = 2; // 数据库版本
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table user(id integer primary key autoincrement , username varchar(20), password varchar(60));";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//如果本次升级数据库完全变化很大,需要删除旧版本,建立新版本;
if (oldVersion == 1 && newVersion == 2) {
db.execSQL("drop table user;");
//自动调用onCreate
}
}
}
分享到:
相关推荐
完整的约会应用程序(Android和iOS版本的应用程序)具有丰富的功能和Web版本。随着约会应用程序的人可以找到新的朋友和沟通在真实的时间,使礼物给对方,等等。响应式网站版本将允许其他操作系统(例如:Windows移动...
这个Android小Demo展示了如何在Android应用程序中使用SQLite数据库。SQLite是一个开源的嵌入式关系型数据库,它的体积小、使用简单、跨平台,非常适合应用于移动设备等资源受限的环境中。Android系统从一开始就内置了...
2.3 android应用程序架构——从此开始 15 2.4 可视化的界面开发工具 18 2.5 部署应用程序到android手机 19 第3章 用户人机界面 22 3.1 更改与显示文字标签 23 3.2 更改手机窗口画面底色 24 3.3 ...
Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。 Beta 版 的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 ...
android-db-migration项目提供了一个库,可减轻在Android客户端中升级数据库架构的麻烦。 特征: 无缝升级多个架构版本 在单元测试中验证数据库架构升级的完整性(即:检测特定架构版本是否缺少迁移脚本) 易于...
2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签 3.2 更改手机窗口画面底色 3.3 更改TextView文字颜色 3.4 置换TextView...
2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签 3.2 更改手机窗口画面底色 3.3 更改TextView文字颜色 3.4 置换TextView...
2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签 3.2 更改手机窗口画面底色 3.3 更改TextView文字颜色 3.4 置换TextView...
2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签 3.2 更改手机窗口画面底色 3.3 更改TextView文字颜色 3.4 置换TextView...
2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签 3.2 更改手机窗口画面底色 3.3 更改TextView文字...
22、Android应用程序的自动更新升级(自身升级、通过tomcat) 共4个目标文件!~如题。 23、Android游戏疯狂连连看源代码 共15个目标文件!~代码注释比较丰富,而且资源文件完整,还有文档,看上去一切都很规范,...
运行代码:后端: 使用pip install -r requirements.txt在Requirements.txt文件中安装所有库在.env文件中设置数据库路径flask db init flask db迁移flask DB升级烧瓶运行运行React Native代码:React Native版本> ...
该库为开发人员提供了一种简单的方法,可将其Android应用程序与现有SQLite数据库(可能已预先填充数据)一起发货,并管理其初始创建以及后续版本发布所需的任何升级。 它被实现为Room的扩展,提供了一种将Room与...
Activity Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务,是一个负责与用户交互的组件 SSH 为 Struts+Spring+Hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架。...
◆Android Wear应用程序 ◆密码强度分析 ◆密码生成器 ◆浏览器集成 ◆免费桌面应用程序(Windows,Mac) ◆自动数据导入 ◆跨平台 易于使用 自己尝试并享受易于使用但功能强大的用户界面。 物料设计 ...
1.4 hello android应用程序的开发 11 1.4.1 第一个android应用程序 12 1.4.2 android应用程序的项目结构 14 1.4.3 android应用程序的调试 16 1.4.4 实际设备的联机调试 18 1.5 android应用程序运行...
由于马来西亚理科大学的eCuti CampusOnline 应用程序没有Android 版本,所以我主动将其开发为Android 编程练习。 此应用程序无法直接访问 CampusOnline 数据库或访问应用程序编程接口 (API)。 它使用抓取技术来获取...