SQLiteDatabase帮助类SQLiteOpenHelper的使用

SQLiteOpenHelper是SQLiteDatabse的一个帮助类,用来管理数据的创建和版本更新。一般的用法是定义一个类继承SQLiteOpenHelper,并实现两个回调方法,OnCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabse, int oldVersion, int newVersion)来创建和更新数据库,我利用数据库做了一个类似电话本的功能,插入数据,查询数据,和删除数据,界面很丑,主要是讲解SQLiteOpenHelper类的用法,截图如下

SQLiteDatabase帮助类SQLiteOpenHelper的使用SQLiteDatabase帮助类SQLiteOpenHelper的使用SQLiteDatabase帮助类SQLiteOpenHelper的使用

首先我们创建一个DBHelper继承SQLiteOpenHelper,这个是数据库的一个帮助类

package com.example.utils;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {
	private final static int VERSION = 1;
	private final static String DB_NAME = "phones.db";
	private final static String TABLE_NAME = "phone";
	private final static String CREATE_TBL = "create table phone(_id integer primary key autoincrement, name text, sex text, number text, desc text)";
	private SQLiteDatabase db;

	//SQLiteOpenHelper子类必须要的一个构造函数
	public DBHelper(Context context, String name, CursorFactory factory,int version) {
		//必须通过super 调用父类的构造函数
		super(context, name, factory, version);
	}
	
	//数据库的构造函数,传递三个参数的
	public DBHelper(Context context, String name, int version){
		this(context, name, null, version);
	}
	
	//数据库的构造函数,传递一个参数的, 数据库名字和版本号都写死了
	public DBHelper(Context context){
		this(context, DB_NAME, null, VERSION);
	}
	
    // 回调函数,第一次创建时才会调用此函数,创建一个数据库
	@Override
	public void onCreate(SQLiteDatabase db) {
		this.db = db;
		System.out.println("Create Database");
		db.execSQL(CREATE_TBL);
	}

	//回调函数,当你构造DBHelper的传递的Version与之前的Version调用此函数
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		System.out.println("update Database");

	}
	
	//插入方法
	public void insert(ContentValues values){
		//获取SQLiteDatabase实例
		SQLiteDatabase db = getWritableDatabase();
		//插入数据库中
		db.insert(TABLE_NAME, null, values);
		db.close();
	}
	
	//查询方法
	public Cursor query(){
		SQLiteDatabase db = getReadableDatabase();
		//获取Cursor
		Cursor c = db.query(TABLE_NAME, null, null, null, null, null, null, null);
		return c;
		
	}
	
	//根据唯一标识_id  来删除数据
	public void delete(int id){
		SQLiteDatabase db = getWritableDatabase();
		db.delete(TABLE_NAME, "_id=?", new String[]{String.valueOf(id)});
	}
	
	
	//更新数据库的内容
	public void update(ContentValues values, String whereClause, String[]whereArgs){
		SQLiteDatabase db = getWritableDatabase();
		db.update(TABLE_NAME, values, whereClause, whereArgs);
	}
	
	//关闭数据库
	public void close(){
		if(db != null){
			db.close();
		}
	}

}

第一个MainActivity

package com.example.phonebooks;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.Toast;

import com.example.utils.DBHelper;

public class MainActivity extends Activity implements OnClickListener{
	private DBHelper dbHelper;
	//定义三个输入框
	private EditText name, number, desc;
	//定义两个按钮
	private Button submit ,look;
	//定义一个RadioGroup
	private RadioGroup radio;
	private String nameStr, numberStr, descStr;
	private String sexStr = "男";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//实例化DBHelper
		dbHelper = new DBHelper(this);
		
		//根据id 获取到相对应的控件
		name = (EditText)findViewById(R.id.editText1);
		number = (EditText)findViewById(R.id.editText2);
		desc = (EditText)findViewById(R.id.editText3);
		submit = (Button)findViewById(R.id.button1);
		look = (Button)findViewById(R.id.button2);
		radio = (RadioGroup)findViewById(R.id.radioGroup1);
		
		
		//按钮设置点击监听
		submit.setOnClickListener(this);
		look.setOnClickListener(this);
		
		//单选群组的监听
		radio.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			
			@Override
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				if(checkedId == R.id.radio0){
					RadioButton r = (RadioButton) group.findViewById(checkedId);
					sexStr = r.getText().toString();
				}
				if(checkedId == R.id.radio1){
					RadioButton r = (RadioButton) group.findViewById(checkedId);
					sexStr = r.getText().toString();
				}
				
			}
		});
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.button1:
			if(name.getText().toString().length() != 0){
				nameStr = name.getText().toString();
			}else{
				Toast.makeText(getApplication(), "姓名不能为空", Toast.LENGTH_SHORT).show();
				return;
			}
			if(number.getText().toString().length() != 0){
				numberStr = number.getText().toString();
			}else{
				Toast.makeText(getApplication(), "电话号码不能为空", Toast.LENGTH_SHORT).show();
				return;
			}
			if(desc.getText().toString().length() != 0){
				descStr = desc.getText().toString();
			}else{
				Toast.makeText(getApplication(), "备注不能为空", Toast.LENGTH_SHORT).show();
				return;
			}
			
			//实例化一个ContentValues, ContentValues是以键值对的形式,键是数据库的列名,值是要插入的值
			ContentValues values = new ContentValues();
			values.put("name", nameStr);
			values.put("sex", sexStr);
			values.put("number", numberStr);
			values.put("desc", descStr);
			
			//调用insert插入数据库
			dbHelper.insert(values);
			
			//将三个输入框重置下
			reset();
			break;
		case R.id.button2:
			Intent intent = new Intent();
			intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
			intent.setClass(this, ResultActivity.class);
			startActivity(intent);
			break;
		default:
			break;
		}
		
		
		
		
	}
	
	//重置edittext
	private void reset(){
		name.setText("");
		number.setText("");
		desc.setText("");
	}


}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#000000" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="姓名"
        android:textSize="15dp" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView1"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <RadioGroup
        android:id="@+id/radioGroup1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/editText1" >

        <RadioButton
            android:id="@+id/radio0"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="男" />

        <RadioButton
            android:id="@+id/radio1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/radioGroup1"
            android:layout_toRightOf="@+id/textView2"
            android:text="女" />
    </RadioGroup>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/radioGroup1"
        android:text="电话号码" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView2"
        android:ems="10" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/editText2"
        android:text="备注" />

    <EditText
        android:id="@+id/editText3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView3"
        android:lines="5"
        android:ems="10"
        android:inputType="textMultiLine" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:text="查看" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/editText3"
        android:text="插入" />

</RelativeLayout>
用一个Person类来封装姓名,性别,电话,备注这些数据。里面只有get()和set()方法
package com.example.mode;

public class Person {
	private String name;
	private String sex;
	private String number;
	private String desc;
	private int _id;
	
	public int get_id() {
		return _id;
	}
	public void set_id(int _id) {
		this._id = _id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	public String getDesc() {
		return desc;
	}
	public void setDesc(String desc) {
		this.desc = desc;
	}
	
	
}

查看数据的ResultActivity
package com.example.phonebooks;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.database.Cursor;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.example.mode.Person;
import com.example.utils.DBHelper;

public class ResultActivity extends Activity implements OnItemClickListener{
	private ListView listView;
	private DbAdapter adapter;
	DBHelper dbHelper;
	List<Person> bookList = new ArrayList<Person>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.result);
		
		//获取ListView
		listView = (ListView)findViewById(R.id.listView1);
		bookList = queryData();
		//实例化DbAdapter
		adapter = new DbAdapter(getApplication(), bookList);
		listView.setAdapter(adapter);
		listView.setOnItemClickListener(this);
		
	}

	
	//查询数据库,将每一行的数据封装成一个person 对象,然后将对象添加到List中
	private List<Person> queryData(){
		List<Person> list = new ArrayList<Person>();
		dbHelper = new DBHelper(this);
		
		//调用query()获取Cursor
		Cursor c = dbHelper.query();
		while (c.moveToNext()){
			int _id = c.getInt(c.getColumnIndex("_id"));
			String name = c.getString(c.getColumnIndex("name"));
			String sex = c.getString(c.getColumnIndex("sex"));
			String number = c.getString(c.getColumnIndex("number"));
			String desc = c.getString(c.getColumnIndex("desc"));

			//用一个Person对象来封装查询出来的数据
			Person p = new Person();
			p.set_id(_id);
			p.setName(name);
			p.setSex(sex);
			p.setNumber(number);
			p.setDesc(desc);
			
			list.add(p);
		}
		return list;
	}
	
	
	//自定义DbAdapter
	public class DbAdapter extends BaseAdapter{
		private List<Person> list;
		private Context context;
		private LayoutInflater layoutInflater;
		
		public DbAdapter(Context context, List<Person> list){
			layoutInflater = LayoutInflater.from(context);
			this.context = context;
			this.list = list;
		}
		
		//刷新适配器
		public void refresh(List<Person> list){
			this.list = list;
			notifyDataSetChanged();
		}

		@Override
		public int getCount() {
			return list.size();
		}

		@Override
		public Object getItem(int position) {
			return list.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			Person p = list.get(position);
			ViewHolder holder;
			
			if(convertView == null){
				holder = new ViewHolder();
		        convertView = layoutInflater.inflate(R.layout.item, null);
		        holder.name = (TextView)convertView.findViewById(R.id.textView1);
		        holder.sex = (TextView)convertView.findViewById(R.id.textView2);
		        holder.number = (TextView)convertView.findViewById(R.id.textView3);
		        holder.desc = (TextView)convertView.findViewById(R.id.textView4);
		        
		        convertView.setTag(holder);

			}else{
				holder = (ViewHolder) convertView.getTag();
			}
			
			holder.name.setText(p.getName());
			holder.sex.setText(p.getSex());
			holder.number.setText(p.getNumber());
			holder.desc.setText(p.getDesc());
			
			return convertView;
		}
		
		
		public class ViewHolder {
			public TextView name;
			public TextView sex; 
			public TextView number;
			public TextView desc;
			public TextView id;
		}
		
	}
	

	@Override
	public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
		final Person p = bookList.get(position);
		final long temp = id;
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setMessage("真的要删除该记录?").setPositiveButton("是", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				//调用delete()删除某条数据
				dbHelper.delete(p.get_id());
				//重新刷新适配器
				adapter.refresh(queryData());
			}
		}).setNegativeButton("否", new OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				
			}
		}).create().show();
		
		
		// 关闭数据库
		dbHelper.close();
	}
}

显示数据的布局result.xml,里面只有一个ListView
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:cacheColorHint="#00000000"
        android:layout_alignParentTop="true" >
    </ListView>

</RelativeLayout>

ListView 的item

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="TextView" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textView4"
        android:layout_alignParentRight="true"
        android:text="TextView" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textView4"
        android:layout_centerHorizontal="true"
        android:text="TextView" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="19dp"
        android:text="TextView" />

</RelativeLayout>
主要不要忘了在AndroidManifest.xml 注册ResultActivity

项目代码下载

你可能感兴趣的:(database)