SQLiteOpenHelper简介

SQLiteDatabase是Android SDK中操作数据库的核心类之一。使用SQLiteDatabase可以打开数据库,也可以对数据库进行操作。然而为了数据库升级的需要以及使用更方便,往往使用SQLiteOpenHelper的子类来完成创建、打开数据库及各种数据库操作。
     SQLiteOpenHelper是个抽象类,在该类中有如下两个抽象方法,SQLiteOpenHelper的子类必须实现这两个方法。
     public abstract void onCreate(SQLiteDatabase db);
     public abstract void onUpdate(SQLiteDatabase db,int oldVersion,int newVersion);
     SQLiteOpenHelper会自动检测数据库文件是否存在。如果存在,会打开这个数据库,在这种情况下就不会调用onCreate()方法。如果数据库文件不存在,SQLiteOpenHelper首先会创建一个数据库文件,然后打开这个数据库,最后调用onCreate()方法。因此,onCreate()方法一般用来在新创建的数据库中建立表、视图等数据库组建。也就是说oncreate()方法在数据库文件第一次创建时调用。
    先看看SQLiteOpenHelper类的构造方法再解释onUpdate()方法何时会被调用。
    public SQLiteOpenHelper(Context context,String name,CursorFactory factory,int version);
    其中name参数表示数据库文件名(不包括文件路径),SQLiteOpenHelper会根据这个文件名创建数据库文件。version表示数据库的版本号。如果当前传入的数据库版本号比上次创建或升级的版本号高,SQLiteOpenHelper就会调用onUpdate()方法。也就是说,当数据库第一次创建时会有一个初始的版本号。当需要对数据库中的表、视图等组建升级时可以增大版本号,再重新创建它们。现在总结一下oncreate()和onUpdate()调用过程。
    1.如果数据库文件不存在,SQLiteOpenHelper在自动创建数据库后会调用oncreate()方法,在该方法中一般需要创建表、视图等组件。在创建前数据库一般是空的,因此不需要先删除数据库中相关的组件。
    2.如果数据库文件存在,并且当前版本号高于上次创建或升级的版本号,SQLiteOpenHelper会调用onUpdate()方法,调用该方法后会更新数据库的版本号。在onupdate()方法中除了创建表、视图等组件外,还需要先删除这些相关的组件,因此,在调用onupdate()方法前,数据库是存在的,里面还原许多数据库组建。

     综合上述两点,可以得出一个结论。如果数据库文件不存在,只有oncreate()被调用(该方法在创建数据库时被调用一次)。如果数据库文件存在,会调用onupdate()方法升级数据库,并更新版本号。

示例代码如下:

package hfuu.gmm;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class DB extends Activity {
	private MySQLiteHelper msql=null;
	private Button bt1=null;
	private Button bt2=null;
	private Button bt3=null;
	private Button bt4=null;
	private EditText ed1=null;
	private EditText ed2=null;
	private EditText ed3=null;
	private String text1=null;
	private String text2=null;
	private String text3=null;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        msql=new MySQLiteHelper(this,"mydb.db",null,2);
        bt1=(Button)this.findViewById(R.id.button1);
        bt2=(Button)this.findViewById(R.id.button2);
        bt3=(Button)this.findViewById(R.id.button3);
        bt4=(Button)this.findViewById(R.id.button4);
        ed1=(EditText)this.findViewById(R.id.EditText1);
        ed2=(EditText)this.findViewById(R.id.EditText2);
        ed3=(EditText)this.findViewById(R.id.EditText3);
        bt1.setOnClickListener(new OnClickListener(){//增
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				ContentValues values=new ContentValues();
				text1=ed1.getText().toString().trim();
				text2=ed2.getText().toString().trim();
				text3=ed3.getText().toString().trim();
				values.put("_id", Integer.parseInt(text1));
				values.put("name", text2);
				values.put("age", Integer.parseInt(text3));
				msql.insert(values);
				Log.d("Infor", "添加成功!");
			}
        	
        });
        bt2.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				msql.delete(Integer.parseInt(ed1.getText().toString()));
				Log.d("Infor", "删除成功!");
			}
        	
        });
        
        bt3.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				msql.query();
			}
        	
        });
        bt4.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				 text1=ed1.getText().toString().trim();
				 text2=ed2.getText().toString().trim();
				 text3=ed3.getText().toString().trim();
				msql.update(Integer.parseInt(text1),text2,Integer.parseInt(text3));
			}
        	
        });
	}
}


 class MySQLiteHelper extends SQLiteOpenHelper{
    private static final String CREATE_TABLE_SQL="create table student(_id integer primary key autoincrement,name text,age integer)";
	private static final String TBL_NAME="student";
    private SQLiteDatabase db;
    public MySQLiteHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
		Log.d("Infor", "建立数据库");
		
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		Log.d("Infor", "SQLite中OnCreate()调用");
		this.db=db;
		db.execSQL(CREATE_TABLE_SQL);
		
		
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		Log.d("Infor", "SQLite中OnUpgrade()调用");

   
	}
	 public void insert(ContentValues values){
	    	SQLiteDatabase db=this.getWritableDatabase();
	    	db.insert(TBL_NAME, null, values);
	    	db.close();
	    }
	
	 public void delete(int id){
		 if(db!=null){
		 db=this.getWritableDatabase();
		 db.delete(TBL_NAME, "_id=?", new String[]{String.valueOf(id)});
		 }
	 }
	 public void query(){
		db=this.getWritableDatabase();
		Cursor c=db.query(TBL_NAME, null, null, null, null, null, null);
		if(c.moveToFirst()){
			for(int i=0;i<c.getCount();i++){
				int id=c.getInt(0);
				String name=c.getString(1);
				int age=c.getInt(2);
				Log.d("Infor", ""+id);
				Log.d("Infor", ""+name);
				Log.d("Infor", ""+age);
				c.moveToNext();
			}
		}
	 }
	 public void update(int id,String name,int age){
		 db=this.getWritableDatabase();
		String sql="update student set name='"+name+"' and age="+age+" where _id="+id;
		Log.d("Infor", sql);
		//db.execSQL(sql);
		ContentValues values=new ContentValues();
		values.put("name", name);
		values.put("age", age);
		String []whereArgs={String.valueOf(id)};
		String whereClause="_id=?";
		db.update(TBL_NAME, values, whereClause, whereArgs);
	 }
	 public void close(){
		 if(db!=null)
			 db.close();
	 }
	
}



你可能感兴趣的:(SQLiteOpenHelper简介)