浅谈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);

    }

    @Override
    public 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这个类的context
		private TextView tv;
    @Override
    protected 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方法里更新。

时间: 2024-07-29 08:58:37

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

浅谈SQLiteOpenHelper之onCreate例子

哈喽大家好!如果你感觉SQLiteOpenHelper不懂的可以看一下.  onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行. 直接上代码: 新建一个QqlText类 package com.example.sjk; import android.content.Context; import android.database.sqlite.SQLiteCursor; import android.database

浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore

本文转载自:http://www.cnblogs.com/kenkofox/p/4648472.html 上一篇<浅谈HTML5单页面架构(一)——requirejs + angular + angular-route>探讨了angular+requirejs的一个简单架构,这一篇继续来看看backbone如何跟requirejs结合. 相同地,项目架构好与坏不是说用了多少牛逼的框架,而是怎么合理利用框架,让项目开发更流畅,代码更容易管理.那么带着这个目的,我们来继续探讨backbone. 首

浅谈HTML5单页面架构(一)——requirejs + angular + angular-route

本文转载自:http://www.cnblogs.com/kenkofox/p/4643760.html 心血来潮,打算结合实际开发的经验,浅谈一下HTML5单页面App或网页的架构. 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又要数单页面架构体验最好,更像原生app.简单来说,单页面App不需要频繁切换网页,可以局部刷新,整个加载流畅度会好很多. 废话就不多说了,直接到正题吧,浅谈一下我自己理解的几种单页面架构: 1.requirejs

浅谈安全性攻击人为攻击的主要形式和防御

0x01 安全性攻击主要的两种方式 当前,对信息系统(包括硬件.软件.数据.人.物理环境及其基础设施)的攻击来自多方面,这些攻击我们可以宏观地分为人为攻击(主观因素)和自然灾害攻击(客观因素),这两大类的攻击都会对信息安全构成威胁.造成自然灾害攻击的自然因素包括各种自然灾害:如水.火.雷.电.风暴.烟尘.虫害.鼠害.海啸和地震等:系统的环境和场地条件,如温度.湿度.电源.地线和其他防护设施不良造成的威胁:电磁辐射和电磁干扰的威胁:硬件设备自然老化,可靠性下降的威胁等.因为自然灾害往往不可预知和抗

浅谈RAII&智能指针

关于RAII,官方给出的解释是这样的"资源获取就是初始化".听起来貌似不是很懂的哈,其实说的通俗点的话就是它是一种管理资源,避免内存泄漏的一种方法.它可以保证在各种情况下,当你对对象进行使用时先通过构造函数来进行资源的分配和初始化,最后通过析构函数来进行清理,有效的保证了资源的正确分配和释放.(特别是在异常中,因为异常往往会改变代码正确的执行顺序,这就很容易引起资源管理的混乱和内存的泄漏) 其中智能指针就是RAII的一种实现模式,所谓的智能就是它可以自动化的来管理它所指向那份空间的资源

浅谈C中的malloc和free

在C语言的学习中,对内存管理这部分的知识掌握尤其重要!之前对C中的malloc()和free()两个函数的了解甚少,只知道大概该怎么用——就是malloc然后free就一切OK了.当然现在对这两个函数的体会也不见得多,不过对于本文章第三部分的内容倒是有了转折性的认识,所以 写下这篇文章作为一个对知识的总结.这篇文章之所以命名中有个“浅谈”的字眼,也就是这个意思了!希望对大家有一点帮助! 如果不扯得太远的话(比如说操作系统中虚拟内存和物理内存如何运做如何管理之类的知识等),我感觉这篇文章应该是比较

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

浅谈结对编程

浅谈结对编程 结对编程 结对编程,是一种敏捷软件开发的方法,极限编程的组成部分.结对编程技术是指两位程序员肩并肩地坐在同一台电脑前合作完成同一个设计.同一个算法.同一段代码或同一组测试.一人充当“执行”角色,只负责编程.另外则负责“观察者”(或“导航”),检测bug和把控整体设计.两个程序员具有相同的缺点和盲点的可能性很小,所以当我们采用结对编程的时候会获得一个强大的解决方案.而这个解决方案恰恰是其它软件工程方法学中所没有的. 由于自己长时间都习惯了一个人编程,所以在这次结对编程的初期在做项目的

浅谈算法和数据结构

: 一 栈和队列 http://www.cnblogs.com/yangecnu/p/Introduction-Stack-and-Queue.html 最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因.另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的. 计算