• 浅谈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方法里更新。

  • 相关阅读:
    Python动态展示遗传算法求解TSP旅行商问题
    MOEAD算法中均匀权向量的实现---Python
    HDU 5294 多校第一场1007题 最短路+最小割
    POJ 3261 Milk Patterns sa+二分
    HDU 4292 FOOD 2012 ACM/ICPC Asia Regional Chengdu Online
    CodeForces 201A Clear Symmetry
    POJ 1679 The Unique MST 确定MST是否唯一
    POJ 3268 Silver Cow Party 最短路 基础题
    POJ 2139 SIx Degrees of Cowvin Bacon 最短路 水題
    POJ2229 Sumsets 基礎DP
  • 原文地址:https://www.cnblogs.com/896240130Master/p/6128557.html
Copyright © 2020-2023  润新知