浅谈SQLiteOpenHelper之onUpgrade例子

当你看到这个博文,首先你要了解onCreate这个创建方法,再来继续下文!(可以参考我的上一个博文http://www.cnblogs.com/896240130Master/p/6119616.html)

这个onUpgrade类要在onCreate类的基础上建立!我们知道onUpgrade是升级的意思。

看代码:新建一个类SqlText.java

package com.example.sjk;import android.content.Context;
import android.database.sqlite.SQLiteCursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;public class SqlText extends SQLiteOpenHelper{private static final String DB_NAME = "mydata.db"; //数据库名称private static final int version =2; // 当前数据库版本号是升级到2了public SqlText(Context context) {super(context, DB_NAME, null, version);}@Overridepublic void onCreate(SQLiteDatabase db) { //新安装的软件从这里开始String sql_message = "create table t_message (id int  primary key,name varchar(50),age varchar(50),sex varchar(10))";//升级的时候增加了一个列sex,所以为了和版本2升级的一样这里也要对应db.execSQL(sql_message);Log.i("onCreate", "你是新用户,我们在帮你创建表--->成功");String sql_up1 = "insert into t_message values(1,'小白','18','男')";db.execSQL(sql_up1);Log.i("onCreate", "你是新用户,我们帮你插入一条数据-->成功");}@Override//在原来的软件上更新会从这里开始,不卸载在线更新public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {   //本文讨论这个方法if(oldVersion == 1){//如果版本是1.0的,升级下面的内容或修改String sql_upgrade = "alter table t_message add sex varchar(10)";//增加一个列sex
             db.execSQL(sql_upgrade);String sql_up2 ="insert into t_message values(3,'小红','18','男')";db.execSQL(sql_up2);Log.i("onUpgrade","你在没有卸载的情况下,在线更新了版本2.0,同时列表增加了一个列sex"); }}}

 

在MainActivity.java 显示

package com.example.sjk;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.TextView;public class MainActivity extends Activity {private SqlText st; //得到SqlText这个类的contextprivate TextView tv;	@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv = (TextView) findViewById(R.id.TextView);//找到这个TextView组件st = new SqlText(MainActivity.this);String text = query();//调用查询这个方法tv.setText("id \t"+"name\t"+"age\t"+"sex\n"+text+"\n");//显示}public String query(){//查询数据库的数据String result = "";//获取数据库对象SQLiteDatabase db = st.getReadableDatabase();//只读:ReadableDatabase;读写:WritableDatabase//查询数据库中的数据Cursor cursor = db.query("t_message", null, null, null, null, null, null);//结果集for(int i=0;i<cursor.getCount();i++) {cursor.moveToNext();result +=  cursor.getInt(cursor.getColumnIndex("id"));result +=  cursor.getString(cursor.getColumnIndex("name"));result +=  cursor.getString(cursor.getColumnIndex("age"));	result +=  cursor.getString(cursor.getColumnIndex("sex"));	}cursor.close();//关闭结果集db.close();//关闭数据库对象return result;}}

  

现在我们在版本号1上,安装这个新的版本2。也就是说也就是说不卸载版本1,直接覆盖版本2看下图

更新了版本,并且增加了一个列

 

 

我们插入的是一条数据,为什么是两条呢,是因为我们在版本1.0的时候就已经有了一条数据,后面sex在1.0的时候没有所以是null,

 

我们再来第2次测试,卸载安装的。重新安装看看还是原来的数据或者执行的是onCreate方法还是onUpgrade 方法?

 

结果:

 

 显示:

我们的出一个结论:

当你Android安装一个全新的应用,会从onCreate这个方法里创建。

当你Android在旧版本上更新的时候会从onUpgrade方法里更新。

 

转载于:https://www.cnblogs.com/896240130Master/p/6128557.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jboss-AS目录结构了解(资料摘取)

Directory Description bin Contains startup, shutdown and other system-specific scripts. Basically all the entry point JARs and start scripts included with the JBoss distribution are located in the bin directory. 包含了服务器启动&#xff0c;关闭和系统相关…

MySQL 字符串分割 SUBSTRING_INDEX函数

From: MySQL 字符串分割 SUBSTRING_INDEX函数 Sql代码 SUBSTRING_INDEX(str,delim,count) 用delim 分割str&#xff0c;取第count个子串 url http://www.medhelp.org/forums/Acne/show/56 Java代码 substring_index(url,"/",1) 结果是http: Java代码 substri…

C++学习笔记6:多文件编程

1.添加文件到工程中&#xff1b; 2.函数调用时需要前向声明;以下为实例&#xff1a; //add.cpp int add(int x, int y) {return (x y); } //main.cpp #include "iostream" using namespace std;int add(int x, int y);int main(void) {cout << "the resu…

mysql 自定义函数function,函数和存储过程的区别

From: https://blog.csdn.net/u010365819/article/details/80470448 1.MySQL自定义函数简介 在MySQL中使用自定义函数也需要相应的要求&#xff0c;语法如下&#xff0c; 创建新函数&#xff1a; Create function function_name(参数列表) returns返回值类型 函数体内容 …

2013年28周信息安全汇总(7.7 - 7.13)

补丁本周是微软发布补丁的日子了&#xff0c;这一次一共需要打上 7 个补丁&#xff0c;其中有 6 个都是最高级别的“严重”级补丁&#xff0c;主要影响 .NET Framework、Silverlight、Windows、Office、Visual Studio 和 IE&#xff0c;可怜我的操作系统早已是补丁累补丁了。不…

Linux下创建动态库与使用

参考文章&#xff1a;dll和so文件区别与构成&#xff1a;http://www.cnblogs.com/likwo/archive/2012/05/09/2492225.html 动态库路径配置- /etc/ld.so.conf文件&#xff1a;http://blog.csdn.net/blade2001/article/details/32839937 1.如何生成一个动态库&#xff1a; 假设有…

XEN--转载自鸟哥的linux私房菜

初探 XenXen 的效能為什麼能夠這麼好&#xff1f; Xen 在使用上面有什麼樣的限制&#xff1f;我的一部主機最多可以支援幾個 Xen 的模擬環境&#xff1f; Xen 的模擬環境有幾種類型&#xff1f; 這些疑問我們都得要先知道一下才好&#xff01; 當然&#xff0c;最好能夠有個簡單…

[Mojava 10.14.4] Clover隐藏多余分区, 原来可以这么简单

好不容易把黑苹果装完了, 搞定驱动和引导, 剩下的也没啥了, 但还有一事: 隐藏clover中多余的启动项! 直接上最关键的部分: 1. 打开Clover Configurator, 挂载对应的EFI分区 2. 打开分区,加载对应的config.plist文件 3. 切换到Clover Configurator的Gui界面, 添加需要隐藏的项…

Mac下如何配置环境变量

以前都是在Windows平台上开发&#xff0c;在配置一些框架的时候&#xff0c;为了能够在命令行中调用&#xff0c;一般都会配置bin目录到环境变量中&#xff0c;这是为了让命令行在执行的时候&#xff0c;能够查找到对应的执行文件。 现在工作使用Mac&#xff0c;配置环境变量不…

C Primer+Plus(十七)高级数据表示 编程练习(二)

7、编写一个程序&#xff0c;能打开、读入一个文本文件并统计文件中每个单词出现的次数。用改进的二叉搜索树存储单词及其出现的次数。程序读入文件后&#xff0c;会提供一个有三个选项的菜单。第一个选项为列出所有单词连同其出现的次数。第二个选项为让您输入一个单词&#x…

Mybatis高级-resultMap之collection聚集

From: https://aodeng.cc/archives/mybatisgaoji 简介 聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性&#xff0c;属性的javaType&#xff08;一般为ArrayList&#xff09;&#xff1b;列表中对象的类型ofType&#xff08;Java实体类&#xff09;&#…

Atitit  数据存储的分组聚合 groupby的实现attilax总结

Atitit 数据存储的分组聚合 groupby的实现attilax总结 1. 聚合操作1 1.1. a、标量聚合 流聚合1 1.2. b、哈希聚合2 1.3. 所有的最优计划的选择都是基于现有统计信息来评估3 1.4. 参考资料3 1. 聚合操作 聚合也是我们在写T-SQL语句的时候经常遇到的&#xff0c;我们来分析一下一…

[java理论篇]--java的其他常用API

1、java的正则表达式&#xff1a;常用方法&#xff1a;String matches&#xff08;匹配&#xff09; &#xff1b;String split&#xff08;切割&#xff09;&#xff1b;String replaceAll(替换)&#xff1b;利用正则表达式获取字符创的核心代码&#xff1a;String str“ds…

pojo类无法注入service解决示例

From: https://blog.csdn.net/danielzhou888/article/details/83351913 本示例解决springboot中service无法注入普通jopo的问题。 不啰嗦&#xff0c;直接上代码。 如果该示例帮您解决了问题&#xff0c;请助推哦。 pojo类&#xff1a; package com.scmd.controller;import…

图测试题部分总结.ing

一个无向连通图的生成树是含有该连通图的全部顶点的&#xff08;极小连通子图&#xff09; 在有向图G的拓扑序列中&#xff0c;若顶点Vi在顶点Vj之前&#xff0c;则下列情形不可能出现的是&#xff08;D&#xff09;A&#xff0e;G中有弧<Vi&#xff0c;Vj> B&#xff0e…

mybatis动态sql中的where标签的使用

From: https://blog.csdn.net/wobuaizhi/article/details/81874664 在使用mybatis的动态sql时&#xff0c;有时候遇到根据条件判断添加where后面的筛选条件。 会出现多余的“and”或者“or”&#xff0c;如下&#xff1a; <select id"findBlog" result…

电脑公司 Ghost XP SP3 国庆特别版 v2011.10

电脑公司 Ghost XP SP3 国庆特别版 v2011.10 文件名称:DNGS_GhostXpSp3_v2011.10.iso文件大小:686.59MB &#xff08;719,945,728字节&#xff09;系统格式:NTFSCRC32:DDEBC170MD5:FA264E6241154EE7F80EFED3CFF1C6A2SHA1:FFEB1C13854AA954D9EE384153815FAF52E0747B电脑城系统 …

Linux C 预处理详解

1.预处理程序 按照ANSI标准的定义&#xff0c;预处理程序应该处理以下指令&#xff1a; #if #ifdef #ifndef #else #elif #endif #define #undef #line #error #pragma #include 显然&#xff0c;上述所有的12个预处理指令都以符号#开始&#xff0c;每条预处理指令必须独占一行…

Spring Boot 中使用 @Transactional 注解配置事务管理

From: https://blog.csdn.net/nextyu/article/details/78669997 事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务&#xff1b;声明式事务基于 AOP,将…

TCP中间件_Delphi_client

1、界面 1.1、formMain.pas 1.1.1、 object frmMain: TfrmMainLeft 191Top 103Width 542Height 466Caption frmMainColor clBtnFaceFont.Charset DEFAULT_CHARSETFont.Color clWindowTextFont.Height -11Font.Name MS Sans SerifFont.Style []OldCreateOrder False…