zoukankan      html  css  js  c++  java
  • 浅谈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 	"+"name	"+"age	"+"sex
    "+text+"
    ");//显示
        }
        
        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方法里更新。

  • 相关阅读:
    JS立即执行函数: (function ( ){...})( ) 与 (function ( ){...}( )) 有区别?
    JS闭包和引用
    数据驱动测试二:使用TestNG和CSV文件进行数据驱动
    在SpringTest中将Mockito的mock对象通过spring注入使用
    Mockito各场景使用介绍
    mockito中两种部分mock的实现,spy、callRealMethod
    Docker学习笔记
    Docker实践(二):容器的管理(创建、查看、启动、终止、删除)
    mac 安装 RabbitMQ
    Mac 隐私与安全没有允许任何来源选项
  • 原文地址:https://www.cnblogs.com/896240130Master/p/6128557.html
Copyright © 2011-2022 走看看