前言

上面已经说了,对表进行修改,其实就是对数据库进行升级,删除表也算升级啊,反正就是发生变化,数据库就需要升级。 
所以老实说其实有个地方决定了数据库的版本

public class DBHelper extends SQLiteOpenHelper {

    public static final String db_name = "test.db";

    public DBHelper(Context context, int version) {
super(context, db_name, null, version);
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table table1 (" +
" _byte byte," +
" _long long," +
" _text text," +
" _short short," +
" _int int," +
" _float float," +
" _double double," +
" _boolean boolean," +
" _blob blob" +
")");
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }

看看这个构造方法,其中第二个参数就是数据库版本号,你可以在第一次发布应用的时候,这个版本号填写1,然后下一个版本,版本号填写2,但是数据库升级可没有那么简单的单纯改个数字就升级完毕了。

是时候好好的介绍一下onCreate和onUpgrade方法了。

onCreate:在创建数据库的时候,调用该方法,如果数据库已经存在了,这个方法将不会被调用。

onUpgrade:当构造方法中的那个version,也就是数据库版本升高了的时候,这个方法才会被调用。
比如,第一次发布应用的时候,这里的version是1,第二次发布应用的时候,刚好数据库要新建一个表,然后需要升级一下数据库,这里于是就传递了个2,这时候onUpgrade方法就会被调用了,不过onCreate方法可不会被调用了啊,因为数据库已经存在了。

这里有一点要提一下,数据库只能升级,不能降级,不然会报错的。

创建数据库
上面大概说了,onCreate和onUpgrade方法大概是在什么时候被调用的,所以基于这个原理。如果我们要新增表或者修改表,我们就在onUpgrade方法中写。这里举个例子,假设我们已经发布了数据库版本为1的应用。
数据库建立如下:

public class DBHelper extends SQLiteOpenHelper {

    public static final String db_name = "test.db";

    public DBHelper(Context context, int version) {
super(context, db_name, null, version);
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table table1 (_text text)");
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
} }

此时我们调用的方式为:

// 当前数据库的版本为1
new DBHelper(context, )

其实我们就创建了一个表名为table1的表而已,不妨运行后来看看,数据库文件保存在data/data/包名/databases/xxx.db

表也创建好了

看看表中字段

都没有问题,接下来,我们开始升级数据库,比如,新建表。

数据库升级-新增表

接下来,我们新增一个表,所以就应该这样写:

public class DBHelper extends SQLiteOpenHelper {

    public static final String db_name = "test.db";

    public DBHelper(Context context, int version) {
super(context, db_name, null, version);
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table table1 (_text text)");
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (newVersion) {
case :
case :
// 新增表table2
db.execSQL("create table table2 (_text text)");
break;
} } }

所以在用的时候,就应该这样用:

// 当前数据库的版本为2
new DBHelper(context, )

看看?

没啥问题

数据库升级-删除表

其实主要还是调用SQL语句执行任务,所以:

public class DBHelper extends SQLiteOpenHelper {

    public static final String db_name = "test.db";

    public DBHelper(Context context, int version) {
super(context, db_name, null, version);
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table table1 (_text text)");
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (newVersion) {
case :
case :
db.execSQL("create table table2 (_text text)");
case :
db.execSQL("drop table table2");
break;
} } }

使用:

// 当前数据库的版本为3
new DBHelper(context, )

数据库升级-新增字段

给某个表新增字段:

public class DBHelper extends SQLiteOpenHelper {

    public static final String db_name = "test.db";

    public DBHelper(Context context, int version) {
super(context, db_name, null, version);
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table table1 (_text text)");
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (newVersion) {
case :
case :
db.execSQL("create table table2 (_text text)");
case :
db.execSQL("drop table table2");
case :
db.execSQL("alter table table1 ADD _long long");
break;
} } }

使用:

// 当前数据库的版本为4
new DBHelper(context, )

总结
大概差不多就是以这种方式对数据库进行升级,这里主要是使用sql语句对数据库进行操作,如果对sql语句不熟悉的人,可能需要在使用前查询一下了。
这里大概说几种常用的sql语句的结构:

新增表:

create table 表名 (字段 类型)

删除表:

drop table 表名

修改表-新增表字段

alter table 表名 add 字段 类型

修改表-删除字段

alter table 表名 drop column 字段名

SQLite支持正常的SQL语句,只需要调用SQLiteDatabase对象的execSQL方法就可以直接通过SQL语句对数据库进行操作了

大家可以在这里了解到SQL语句的用法

还有一点要说明的就是,为啥onUpgrade方法中的switch,不是每个case都对应一个break,这里其实是一个小技巧,我们在使用数据库升级的时候,往往switch这里是这样写的:

    switch (newVersion) {
case :
// 更新1
case :
// 更新2
case :
// 更新3
case :
// 更新4
case :
// 更新5
case :
// 更新6
case :
// 更新7
...
break;
}

因为这样写有一个好处,假设我们的应用,最新版已经升级到第7个版本了,但是有的用户还在用第4个版本,这时候,如果这个用户直接升级到最新的第7版,这里的执行,就会是

更新5
更新6
更新7

就把以前遗漏的更新全部赶上了,这就这样写的好处。

本章主要就是讲数据库升级,流程大概就是这么个流程,就这样吧!

---------------------
版权声明:本文为CSDN博主「你缺少想象力」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/IT_XF/article/details/82684562

Android数据库使用指南(下)的更多相关文章

  1. Android数据库使用指南(上)

    前言Android上的数据库是sqlite,虽然这个数据库是轻量级的,但是储存的东西可不少,sqlite官方表示理论存储容量为140TB,目前应该没有那么大容量的手机,存储能力太强了. 关于如何使用S ...

  2. Android数据库

    Android数据库 什么情况下我们才用数据库做数据存储? 大量数据结构相同的数据需要存储时.Android内置了sqlite,轻量级. 创建数据库的方法 创建一个类继承SqliteOpenHelpe ...

  3. Android Realm数据库使用指南

    Android Realm数据库使用指南 Realm数据库, 目前有Java, Objective‑C, React Native, Swift, Xamarin的几种实现, 是一套用来取代SQLit ...

  4. 不root手机的情况下查看Android数据库

    最近写Android的时候发现想要读取数据库很不方便,使用adb工具的方法需要root手机,而华为手机root十分麻烦,需要解除密码,一些品牌手机即使root了也没有sqlite3命令,总之十分麻烦. ...

  5. 读书笔记--Android Gradle权威指南(下)

    前言 最近看了一本书<Android Gradle 权威指南>,收获挺多,就想着来记录一些读书笔记,方便后续查阅. 本篇内容是基于上一篇:读书笔记--Android Gradle权威指南( ...

  6. Unity开发Android应用优化指南(下)

    http://forum.china.unity3d.com/thread-27044-1-1.html 在Unity开发Android应用优化指南(上)一文中,从游戏性能,脚本等方面进行了分析和总结 ...

  7. Android开发权威指南(第2版)新书发布

    <Android 开发权威指南(第二版)>是畅销书<Android开发权威指南>的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45 章精彩内容供 ...

  8. 最全面的 Android 编码规范指南

    最全面的 Android 编码规范指南 本文word文档下载地址:http://pan.baidu.com/s/1bXT75O 1. 前言 这份文档参考了 Google Java 编程风格规范和 Go ...

  9. Android SDK 开发指南

    Android SDK 开发指南 视频详解 以下视频是对融云 Android SDK 开发使用的详细讲解,您可以在阅读文档时配合学习.   更多视频教程如下: CSDN 融云 Android SDK ...

随机推荐

  1. Android处理未捕获的异常(应用全局异常)

    public class CrashHandler implements UncaughtExceptionHandler { private static CrashHandler instance ...

  2. DVWA--XSS(DOM)

    0X01爱之先了解 DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容.结构以及样式. DOM型XSS其实是一种特殊类型 ...

  3. [CSP-S模拟测试]:新的世界(BFS)

    题目背景 小学五六年级的乔猫是一个喜欢不务正业写游戏的孩纸$......$他曾经模仿著名的沙盒游戏<$Minecraft$>做过一个自己的游戏$"NEWorld"$.这 ...

  4. nginx中lua动态返回文件

    原来还可以这么操作,lua动态获取内容然后返回,下面是实例,可以做到先返回一个字符串,然后过5秒再返回另外一个字符串 ngx.say("hello") ngx.flush(true ...

  5. kafka 消费者拉取消息

    本文只跟踪消费者拉取消息的流程.对于 java 客户端, kafka 的生产者和消费者复用同一个网络 io 类 NetworkClient. 入口在 KafkaConsumer#pollOnce 中, ...

  6. Unity UI —Text

    Character Text 文本字体的编辑 Font Style 字体格式可以自行下载也可在windows自带字体中查找 Font Size 字体尺寸 Line Spacing 行距 Rich Te ...

  7. 正则表达式——Unicode 属性列表

    7.7.1 Unicode Property   每个 Unicode 字符都只能属于一个 Unicode Property.所有的 Unicode Property 共分为7大类,30小类.大类的名 ...

  8. 社工 - By浏览器 - Google搜索技巧 - 汇总

    google基本语法 Index of: 使用它可以直接进入网站首页下的所有文件和文件夹中 intext: 将返回所有在网页正文部分包含关键词的网页 intitle: 将返回所有网页标题中包含关键词的 ...

  9. centOs 常用操作

    centos 官网下载:https://www.centos.org/download/从官网下载iso,教程:https://jingyan.baidu.com/article/1876c85279 ...

  10. Docker最详细入门教程

    Docker原理.详细入门教程 https://blog.csdn.net/deng624796905/article/details/86493330 阮一峰Docker入门讲解 http://ww ...