Android SQLiteDatabase帮助类SQLiteOpenHelper的使用

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
时间: 2024-11-08 20:25:35

Android SQLiteDatabase帮助类SQLiteOpenHelper的使用的相关文章

Android SQLiteDatabase分析

Android中的数据存储使用的小巧的SQLite数据库.为了方便java层使用SQLite,android做了大量的封装,提供了一些列的类和API.本文章就揭露这些封装背后的类图关系. 老规矩,首先上图: SQLiteOpenHelper是Android SDK所提供的一个帮助类,通过此类来管理数据库的创建和版本控制. 通过SQLiteOpenHelper函数getReadableDatabase和函数getWritableDatabase可以得到一个SQLiteDatabase对象.用户通过

Android中Cursor类的概念和用法

每天学习大量的东西,好多东西都不知道,只好百度.将自己的博客打造成一个文件库 原文链接:http://www.2cto.com/kf/201109/103163.html 关于 Cursor 在你理解和使用 Android Cursor 的时候你必须先知道关于 Cursor 的几件事情: Cursor 是每行的集合.使用 moveToFirst() 定位第一行.你必须知道每一列的名称.你必须知道每一列的数据类型.Cursor 是一个随机的数据源.所有的数据都是通过下标取得.关于 Cursor 的

[Android自定义控件] Android Scroller工具类和GestureDetector的简单用法

转载:http://ipjmc.iteye.com/blog/1615828 Android里Scroller类是为了实现View平滑滚动的一个Helper类.通常在自定义的View时使用,在View中定义一个私有成员mScroller = new Scroller(context).设置mScroller滚动的位置时,并不会导致View的滚动,通常是用mScroller记录/计算View滚动的位置,再重写View的computeScroll(),完成实际的滚动. mScroller.getCu

Android技术18:Android中Adapter类详解

1.Adapter设计模式 Android中adapter接口有很多种实现,例如,ArrayAdapter,BaseAdapter,CursorAdapter,SimpleAdapter,SimpleCursorAdapter等,他们分别对应不同的数据源.例如,ArrayAdater对应List和数组数据源,而CursorAdapter对应Cursor对象(一般从数据库中获取的记录集).这些Adapter都需要getView方法返回当前列表项显示的View对象.当Model发生改变时,会调用Ba

【Android】Android中Service类onStartCommand的返回值有关问题(转)

@Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("---------->>onStartCommand2"); return super.onStartCommand(intent, flags, startId); } Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象

Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法

如下面所示,同时导入这两个,会提示其中一个与另一个产生冲突. 1 import android.view.View.OnClickListener; 2 import android.content.DialogInterface.OnClickListener; 其实,当我们用某个Listener时,不一定就要import它,直接用全名去定义就不需要import了,例如 1 mButton1.setOnClickListener(new OnClickListener() 2 { 3 4 @O

android中Handle类的用法

android中Handle类的用法 当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无响应,如果时间过长,程序还会挂掉.Handler就是把这些功能放到一个单独的线程里执行,与Activity互不影响. 当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,

android.hardware.Camera类及其标准接口介绍

android.hardware.Camera类及其标准接口介绍,API level 19 http://developer.android.com/reference/android/hardware/Camera.html

Android常用工具类

主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.PreferencesUtils.JSONUtils.FileUtils.ResourceUtils.StringUtils.ParcelUtils.RandomUtils.ArrayUtils.ImageUtils.ListUtils.MapUtils.ObjectUtils.SerializeUtils.S