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

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

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

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

在MainActivity.java 显示

  1. package com.example.sjk;
  2. import android.app.Activity;
  3. import android.database.Cursor;
  4. import android.database.sqlite.SQLiteDatabase;
  5. import android.os.Bundle;
  6. import android.widget.TextView;
  7.  
  8. public class MainActivity extends Activity {
  9. private SqlText st; //得到SqlText这个类的context
  10. private TextView tv;
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. tv = (TextView) findViewById(R.id.TextView);//找到这个TextView组件
  16. st = new SqlText(MainActivity.this);
  17.  
  18. String text = query();//调用查询这个方法
  19. tv.setText("id \t"+"name\t"+"age\t"+"sex\n"+text+"\n");//显示
  20. }
  21.  
  22. public String query(){//查询数据库的数据
  23. String result = "";
  24. //获取数据库对象
  25. SQLiteDatabase db = st.getReadableDatabase();//只读:ReadableDatabase;读写:WritableDatabase
  26. //查询数据库中的数据
  27. Cursor cursor = db.query("t_message", null, null, null, null, null, null);
  28. //结果集
  29. for(int i=0;i<cursor.getCount();i++) {
  30. cursor.moveToNext();
  31. result += cursor.getInt(cursor.getColumnIndex("id"));
  32. result += cursor.getString(cursor.getColumnIndex("name"));
  33. result += cursor.getString(cursor.getColumnIndex("age"));
  34. result += cursor.getString(cursor.getColumnIndex("sex"));
  35. }
  36. cursor.close();//关闭结果集
  37. db.close();//关闭数据库对象
  38. return result;
  39.  
  40. }
  41.  
  42. }

  

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

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

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

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

结果:

显示:

我们的出一个结论:

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

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

浅谈SQLiteOpenHelper之onUpgrade例子的更多相关文章

  1. 浅谈SQLiteOpenHelper之onCreate例子

    哈喽大家好!如果你感觉SQLiteOpenHelper不懂的可以看一下.  onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法 ...

  2. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  3. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  4. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  5. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  6. 浅谈Angular的 $q, defer, promise

    浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00  博客园-原创精华区 原文  http://www.cnblogs.com/big-snow/ ...

  7. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

  8. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  9. 浅谈Hybrid技术的设计与实现

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 随着移动浪潮的兴起,各种APP层出不穷,极速的业务扩展提升了团队对开发 ...

随机推荐

  1. git 代码更新

    第一:先说首次使用 意思就是这个文件夹中的代码你还没有向GITHUB提交过代码 cd /home/test(假如 test就是你的用户名)/githubtest(这是个文件夹,你可以提前先建立好,这个 ...

  2. myeclipse给项目改了名字,但部署tomcat的项目名还是原来的

    如标题所示: 在myeclipse中按F2改了项目名称,之前在tomcat中部署的名称是另一个,再次重新部署,永远是上一个的旧名称 解决办法: 项目点右键-properties-左上角搜索框输入web ...

  3. Windows综合应用

    待修改中-------------------------------------- 快捷键部分: Win+E:打开"我的电脑"E:Explot的缩写,即资源管理器. ------ ...

  4. WIN7 + IIS7 Service Unavailable HTTP Error 503. The service is unavailable.

    在win7上开启IIS功能,进行网站发布. 但是开启IIS之后,打开默认网站都打不开,显示 Service Unavailable HTTP Error 503. The service is una ...

  5. Node.js process 模块常用属性和方法

    Node.js是常用的Javascript运行环境,本文和大家发分享的主要是Node.js中process 模块的常用属性和方法,希望通过本文的分享,对大家学习Node.js http://www.m ...

  6. 在写junit test 的时候出现的java.lang.UnsupportedClassVersionError问题

    今天在写为一些project 写 一些junit  test  的时候,出现下面的异常: java.lang.UnsupportedClassVersionError: moneytest/Money ...

  7. JVM Management API

    JVM本身提供了一组管理的API,通过该API,我们可以获取得到JVM内部主要运行信息,包括内存各代的数据.JVM当前所有线程及其栈相关信 息等等.各种JDK自带的剖析工具,包括jps.jstack. ...

  8. JSP与EL隐式对象

    一,JSP隐式对象 隐式对象是可以直接使用的,无需声明.因为在JSP转译为servlet文件后,会自动声明其对象. 隐式对象① 说明 out 对应JspWriter对象,其内部关联一个PrintWri ...

  9. [UML]UML系列——用例图中的各种关系(include、extend)

    用例图中的各种关系 一.参与者与用例间的关联关系 参与者与用例之间的通信,也成为关联或通信关系. 二.用例与用例之间的关系 包含关系(include) 扩展关系(extend) 包含关系 (1)  概 ...

  10. 使用Java 多线程编程 让三个线程轮流输出ABC,循环10次后结束

    简要分析: 要求三个线程轮流输出,这里我们要使用一个对象锁,让关键部分的代码放入同步块当中.同时要有一个变量记录打印的次数到达10次循环后不再打印,另外一个就是要给每个线程一个标志号,我们根据标识号来 ...