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