您的位置:首页 > 数据库 > SQL

SQLiteOpenHelper简介

2012-07-17 13:20 232 查看
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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息