前言

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

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. 容器————unordered_map

    #include < unordered_map > map: map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此ma ...

  2. Oracle--单实例数据库迁移到RAC集群服务器(RMAN)

    单实例数据库版本:11.2.0.1 RAC实例数据库版本:11.2.0.3 1,在单实例数据库备份文件 RMAN> show all; using target database control ...

  3. 2018-2019-2 20165235《网络对抗技术》Exp7 网络欺诈防范

    2018-2019-2 20165235<网络对抗技术>Exp7 网络欺诈防范 实验目的 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法 实验内容 (1)简单应 ...

  4. ffmpeg保持原视频画面比例 自动添加黑边

    ffmpeg保持原视频画面比例 自动添加黑边 例如源是1280*528要转成640*480要保持画面比例实际上应该640*264 所以需要在上下都加黑边 ffmpeg -i d:/Media/e.f4 ...

  5. sklearn—支持向量机

    SVC介绍: 拟合出来的模型为一个超平面 解决与样本维数无关,适合做文本分类 解决小样本.非线性.高维 是用于分类.回归.孤立点检测的监督学习方法的集合. 优点: 有效的高维空间 维数大于样本数的时候 ...

  6. 使用collection:分段查询结果集

    1.在人员接口书写方法 public List<Employee> getEmpsByDeptId(Integer deptId); 2在人员映射文件中进行配置 <!-- publi ...

  7. PropertyInfo、FieldInfo、MemberInfo的区别

    public class TestClass { ;//私有一律获取不到 public int b { ; } ; } } ; } public static void TestMethod() { ...

  8. babel-node 和 nodemon

    概述 今天我继续完善我做的用来 mock 前端数据的库:ym-mock. 我想要实现 2 个需求: 支持 es6,至少要能 import 吧. 修改了代码之后能自动热更新,不能我修改了服务器代码要手动 ...

  9. WCF 配置说明

    关于WCF中的地址和绑定,需要补充一下. WCF中支持的传输协议包括HTTP.TCP.Peer network(对等网).IPC(基于命名管道的内部进程通信)以及MSMQ(微软消息队列),每个协议对应 ...

  10. 阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_05.mybatis环境搭建-前期准备

    视频中右侧没有勾选 直接finish 用下面的sql里面的一些表来实现今天的功能 只需要用到里面的user表. 这是之前已经建好的数据库 把表都删除掉,用sql语句去创建表和表内的记录,最终的结果: ...