zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android数据库升级实例

2023-09-11 14:20:31 时间

第一部分
Andoird的SQLiteOpenHelper类中有一个onUpgrade方法。帮助文档中只是说当数据库升级时该方法被触发。经过实践,解决了我一连串的疑问:
1. 帮助文档里说的“数据库升级”是指什么?
你开发了一个程序,当前是1.0版本。该程序用到了数据库。到1.1版本时,你在数据库的某个表中增加了一个字段。那么软件1.0版本用的数据库在软件1.1版本就要被升级了。
2. 数据库升级应该注意什么?
软件的1.0版本升级到1.1版本时,老的数据不能丢。那么在1.1版本的程序中就要有地方能够检测出来新的软件版本与老的数据库不兼容,并且能够有办法 把1.0软件的数据库升级到1.1软件能够使用的数据库。换句话说,要在1.0软件的数据库的那个表中增加那个字段,并赋予这个字段默认值。
3. 程序如何知道数据库需要升级?
SQLiteOpenHelper类的构造函数有一个参数是int version,它的意思就是指数据库版本号。比如在软件1.0版本中,我们使用SQLiteOpenHelper访问数据库时,该参数为1,那么数据库版本号1就会写在我们的数据库中。
到了1.1版本,我们的数据库需要发生变化,那么我们1.1版本的程序中就要使用一个大于1的整数来构造SQLiteOpenHelper类,用于访问新的数据库,比如2。
当我们的1.1新程序读取1.0版本的老数据库时,就发现老数据库里存储的数据库版本是1,而我们新程序访问它时填的版本号为2,系统就知道数据库需要升级。
4. 何时触发数据库升级?如何升级?
当系统在构造SQLiteOpenHelper类的对象时,如果发现版本号不一样,就会自动调用onUpgrade函数,让你在这里对数据库进行升级。根据上述场景,在这个函数中把老版本数据库的相应表中增加字段,并给每条记录增加默认值即可。
新版本号和老版本号都会作为onUpgrade函数的参数传进来,便于开发者知道数据库应该从哪个版本升级到哪个版本。
升级完成后,数据库会自动存储最新的版本号为当前数据库版本号。
参考:StackOverFlow对“数据库版本在数据库中的存储位置”的问答。
第二部分做Android应用,不可避免的会与SQLite打交道。随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对 SQLite数据库的结构进行升级了。 SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段。
并且只能在表的末尾添加字段,比如,为 Subscription添加两个字段:
1 ALTER TABLE Subscription ADD COLUMN Activation BLOB;
2 ALTER TABLE Subscription ADD COLUMN Key BLOB;
另外,如果遇到复杂的修改操作,比如在修改的同时,需要进行数据的转移,那么可以采取在一个事务中执行如下语句来实现修改表的需求。
1. 将表名改为临时表
ALTER TABLE Subscription RENAME TO __temp__Subscription;
2. 创建新表
CREATE TABLE Subscription (OrderId VARCHAR(32) PRIMARY KEY ,UserName VARCHAR(32) NOTNULL ,ProductId VARCHAR(16) NOT NULL);
3. 导入数据
INSERT INTO Subscription SELECT OrderId, “”, ProductId FROM __temp__Subscription;
或者
INSERT INTO Subscription() SELECT OrderId, “”, ProductId FROM __temp__Subscription;
* 注意 双引号”” 是用来补充原来不存在的数据的
4. 删除临时表
DROP TABLE __temp__Subscription;
通过以上四个步骤,就可以完成旧数据库结构向新数据库结构的迁移,并且其中还可以保证数据不会应为升级而流失。
当然,如果遇到减少字段的情况,也可以通过创建临时表的方式来实现。

最新内容请见作者的GitHub页:http://qaseven.github.io/


Android App开发超实用实例 | ​Broadcast 介绍Broadcast的静态注册、动态注册及有序广播。 Broadcast(广播)分为发送者和接收者,可实现跨应用的消息传递。重启手机、闹钟、来电、接收短信等都会发出广播,通过BroadcastReceiver就可以接收广播并进行相应处理。
Android 架构MVC MVP MVVM+实例(下) MVC实例 1.在layout创建一个布局文件 2.实体类(User) 3.MVCLoginActivity MVP实例 1.Model层 2.Presenter层 3.View层 MVVM实例 1.Model层 2.ViewModel层 3.View层 实例传送门
Android 架构MVC MVP MVVM+实例(上) MVC是什么? Android中的MVC含义 MVC的缺点 MVP是什么 Android中的MVP含义 MVP的优点 MVP的缺点 MVVM是什么 Android中的MVVM含义 MVVM的优点 MVVM的缺点 MVP和MVC的最大区别 如何选取框架
Android CheckedTextView 使用+实例 CheckedTextView是什么 主要XML属性 在点击事件里判断状态设置状态 第一次点击无效 1.主界面CheckedTextViewActivity.java 2.主布局activity_textview_ctv.xml 3.复选框Adapter 4.复选框adapter对应布局 5.单选框adapter 6.单选框adapter对应布局 7.逻辑处理从adapter放在主界面处
Android ImageView及其子类 介绍+实例(下) ImageButton 什么是ImageButton 通过实例了解ImageButton 1、创建布局文件 运行效果如下: ImageButton灰色边框的产生原因和解决方案 QuickContactBadge 什么是QuickContactBadge QuickContactBadge的调用方法 通过实例了解QuickContactBadge 1、创建布局文件 2、让QuickContactBadge与特定联系人建立联系 3、运行效果
Android ImageView及其子类 介绍+实例(上) ImageView ImageView的继承关系 ImageView支持的常用XML属性 ImageView.ScaleType所支持的常量 ImageView加载图片 实例:用ImageView做一个图片查看器 1、创建布局文件 2、用代码使ImageView显示图片 3、运行效果 ImageView设置图片 设置圆角、圆形 1、通过RoundedBitmapDrawable设置圆角、圆形 2、使用图片加载框架进行设置,以Picasso为例
Android 面试题之 BroadcastReceiver 使用+实例 Broadcast Receiver是什么 Broadcast Receiver使用场景 Broadcast Receiver的种类 按发送顺序 按发送范围 按Broadcast Receiver的实现 Broadcast Receiver的使用 4.1静态注册 4.2动态广播 4.2.1自定义广播接受者, 4.2.2注册广播 4.2.3发送广播 4.2.4注销广播 4.3无序广播 4.4有序广播 Broadcast Receiver实现原理 LocalBroadcastManager特点 Broadcast Receiver注意事项 实例:BroadcastReceiverDemo.zip
Android 面试题之ContentProvider使用+实例 一、什么是ContentProvider 二、什么是Uri 三、什么是ContentResolver 四、创建ContentProvider 五、使用ContentProvider 六、跨应用使用ContentProvider 七、java.lang.SecurityException: Permission Denial: opening provider com.scc.cp.UserProvider from ProcessRecord 源码:ContentProviderDemo.zip