Android SQLiteDatabase

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

Android SQLiteDatabase_第1张图片Android SQLiteDatabase_第2张图片Android SQLiteDatabase_第3张图片

 

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

[java]  view plain  copy
 
  1. package com.example.utils;  
  2.   
  3. import android.content.ContentValues;  
  4. import android.content.Context;  
  5. import android.database.Cursor;  
  6. import android.database.sqlite.SQLiteDatabase;  
  7. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
  8. import android.database.sqlite.SQLiteOpenHelper;  
  9.   
  10. public class DBHelper extends SQLiteOpenHelper {  
  11.     private final static int VERSION = 1;  
  12.     private final static String DB_NAME = "phones.db";  
  13.     private final static String TABLE_NAME = "phone";  
  14.     private final static String CREATE_TBL = "create table phone(_id integer primary key autoincrement, name text, sex text, number text, desc text)";  
  15.     private SQLiteDatabase db;  
  16.   
  17.     //SQLiteOpenHelper子类必须要的一个构造函数  
  18.     public DBHelper(Context context, String name, CursorFactory factory,int version) {  
  19.         //必须通过super 调用父类的构造函数  
  20.         super(context, name, factory, version);  
  21.     }  
  22.       
  23.     //数据库的构造函数,传递三个参数的  
  24.     public DBHelper(Context context, String name, int version){  
  25.         this(context, name, null, version);  
  26.     }  
  27.       
  28.     //数据库的构造函数,传递一个参数的, 数据库名字和版本号都写死了  
  29.     public DBHelper(Context context){  
  30.         this(context, DB_NAME, null, VERSION);  
  31.     }  
  32.       
  33.     // 回调函数,第一次创建时才会调用此函数,创建一个数据库  
  34.     @Override  
  35.     public void onCreate(SQLiteDatabase db) {  
  36.         this.db = db;  
  37.         System.out.println("Create Database");  
  38.         db.execSQL(CREATE_TBL);  
  39.     }  
  40.   
  41.     //回调函数,当你构造DBHelper的传递的Version与之前的Version调用此函数  
  42.     @Override  
  43.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  44.         System.out.println("update Database");  
  45.   
  46.     }  
  47.       
  48.     //插入方法  
  49.     public void insert(ContentValues values){  
  50.         //获取SQLiteDatabase实例  
  51.         SQLiteDatabase db = getWritableDatabase();  
  52.         //插入数据库中  
  53.         db.insert(TABLE_NAME, null, values);  
  54.         db.close();  
  55.     }  
  56.       
  57.     //查询方法  
  58.     public Cursor query(){  
  59.         SQLiteDatabase db = getReadableDatabase();  
  60.         //获取Cursor  
  61.         Cursor c = db.query(TABLE_NAME, nullnullnullnullnullnullnull);  
  62.         return c;  
  63.           
  64.     }  
  65.       
  66.     //根据唯一标识_id  来删除数据  
  67.     public void delete(int id){  
  68.         SQLiteDatabase db = getWritableDatabase();  
  69.         db.delete(TABLE_NAME, "_id=?"new String[]{String.valueOf(id)});  
  70.     }  
  71.       
  72.       
  73.     //更新数据库的内容  
  74.     public void update(ContentValues values, String whereClause, String[]whereArgs){  
  75.         SQLiteDatabase db = getWritableDatabase();  
  76.         db.update(TABLE_NAME, values, whereClause, whereArgs);  
  77.     }  
  78.       
  79.     //关闭数据库  
  80.     public void close(){  
  81.         if(db != null){  
  82.             db.close();  
  83.         }  
  84.     }  
  85.   
  86. }  

第一个MainActivity

[java]  view plain  copy
 
  1. package com.example.phonebooks;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.ContentValues;  
  5. import android.content.Intent;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. import android.widget.EditText;  
  11. import android.widget.RadioButton;  
  12. import android.widget.RadioGroup;  
  13. import android.widget.RadioGroup.OnCheckedChangeListener;  
  14. import android.widget.Toast;  
  15.   
  16. import com.example.utils.DBHelper;  
  17.   
  18. public class MainActivity extends Activity implements OnClickListener{  
  19.     private DBHelper dbHelper;  
  20.     //定义三个输入框  
  21.     private EditText name, number, desc;  
  22.     //定义两个按钮  
  23.     private Button submit ,look;  
  24.     //定义一个RadioGroup  
  25.     private RadioGroup radio;  
  26.     private String nameStr, numberStr, descStr;  
  27.     private String sexStr = "男";  
  28.   
  29.     @Override  
  30.     protected void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.activity_main);  
  33.           
  34.         //实例化DBHelper  
  35.         dbHelper = new DBHelper(this);  
  36.           
  37.         //根据id 获取到相对应的控件  
  38.         name = (EditText)findViewById(R.id.editText1);  
  39.         number = (EditText)findViewById(R.id.editText2);  
  40.         desc = (EditText)findViewById(R.id.editText3);  
  41.         submit = (Button)findViewById(R.id.button1);  
  42.         look = (Button)findViewById(R.id.button2);  
  43.         radio = (RadioGroup)findViewById(R.id.radioGroup1);  
  44.           
  45.           
  46.         //按钮设置点击监听  
  47.         submit.setOnClickListener(this);  
  48.         look.setOnClickListener(this);  
  49.           
  50.         //单选群组的监听  
  51.         radio.setOnCheckedChangeListener(new OnCheckedChangeListener() {  
  52.               
  53.             @Override  
  54.             public void onCheckedChanged(RadioGroup group, int checkedId) {  
  55.                 if(checkedId == R.id.radio0){  
  56.                     RadioButton r = (RadioButton) group.findViewById(checkedId);  
  57.                     sexStr = r.getText().toString();  
  58.                 }  
  59.                 if(checkedId == R.id.radio1){  
  60.                     RadioButton r = (RadioButton) group.findViewById(checkedId);  
  61.                     sexStr = r.getText().toString();  
  62.                 }  
  63.                   
  64.             }  
  65.         });  
  66.     }  
  67.   
  68.     @Override  
  69.     public void onClick(View v) {  
  70.         switch (v.getId()) {  
  71.         case R.id.button1:  
  72.             if(name.getText().toString().length() != 0){  
  73.                 nameStr = name.getText().toString();  
  74.             }else{  
  75.                 Toast.makeText(getApplication(), "姓名不能为空", Toast.LENGTH_SHORT).show();  
  76.                 return;  
  77.             }  
  78.             if(number.getText().toString().length() != 0){  
  79.                 numberStr = number.getText().toString();  
  80.             }else{  
  81.                 Toast.makeText(getApplication(), "电话号码不能为空", Toast.LENGTH_SHORT).show();  
  82.                 return;  
  83.             }  
  84.             if(desc.getText().toString().length() != 0){  
  85.                 descStr = desc.getText().toString();  
  86.             }else{  
  87.                 Toast.makeText(getApplication(), "备注不能为空", Toast.LENGTH_SHORT).show();  
  88.                 return;  
  89.             }  
  90.               
  91.             //实例化一个ContentValues, ContentValues是以键值对的形式,键是数据库的列名,值是要插入的值  
  92.             ContentValues values = new ContentValues();  
  93.             values.put("name", nameStr);  
  94.             values.put("sex", sexStr);  
  95.             values.put("number", numberStr);  
  96.             values.put("desc", descStr);  
  97.               
  98.             //调用insert插入数据库  
  99.             dbHelper.insert(values);  
  100.               
  101.             //将三个输入框重置下  
  102.             reset();  
  103.             break;  
  104.         case R.id.button2:  
  105.             Intent intent = new Intent();  
  106.             intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
  107.             intent.setClass(this, ResultActivity.class);  
  108.             startActivity(intent);  
  109.             break;  
  110.         default:  
  111.             break;  
  112.         }  
  113.           
  114.           
  115.           
  116.           
  117.     }  
  118.       
  119.     //重置edittext  
  120.     private void reset(){  
  121.         name.setText("");  
  122.         number.setText("");  
  123.         desc.setText("");  
  124.     }  
  125.   
  126.   
  127. }  

activity_main.xml

[html]  view plain  copy
 
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="fill_parent"  
  3.     android:layout_height="fill_parent"  
  4.     android:background="#000000" >  
  5.   
  6.     <TextView  
  7.         android:id="@+id/textView1"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_alignParentLeft="true"  
  11.         android:layout_alignParentTop="true"  
  12.         android:text="姓名"  
  13.         android:textSize="15dp" />  
  14.   
  15.     <EditText  
  16.         android:id="@+id/editText1"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_alignParentLeft="true"  
  20.         android:layout_alignParentRight="true"  
  21.         android:layout_below="@+id/textView1"  
  22.         android:ems="10" >  
  23.   
  24.         <requestFocus />  
  25.     </EditText>  
  26.   
  27.     <RadioGroup  
  28.         android:id="@+id/radioGroup1"  
  29.         android:layout_width="wrap_content"  
  30.         android:layout_height="wrap_content"  
  31.         android:layout_alignParentLeft="true"  
  32.         android:layout_below="@+id/editText1" >  
  33.   
  34.         <RadioButton  
  35.             android:id="@+id/radio0"  
  36.             android:layout_width="wrap_content"  
  37.             android:layout_height="wrap_content"  
  38.             android:checked="true"  
  39.             android:text="男" />  
  40.   
  41.         <RadioButton  
  42.             android:id="@+id/radio1"  
  43.             android:layout_width="wrap_content"  
  44.             android:layout_height="wrap_content"  
  45.             android:layout_alignTop="@+id/radioGroup1"  
  46.             android:layout_toRightOf="@+id/textView2"  
  47.             android:text="女" />  
  48.     </RadioGroup>  
  49.   
  50.     <TextView  
  51.         android:id="@+id/textView2"  
  52.         android:layout_width="wrap_content"  
  53.         android:layout_height="wrap_content"  
  54.         android:layout_alignParentLeft="true"  
  55.         android:layout_below="@+id/radioGroup1"  
  56.         android:text="电话号码" />  
  57.   
  58.     <EditText  
  59.         android:id="@+id/editText2"  
  60.         android:layout_width="wrap_content"  
  61.         android:layout_height="wrap_content"  
  62.         android:layout_alignParentLeft="true"  
  63.         android:layout_alignParentRight="true"  
  64.         android:layout_below="@+id/textView2"  
  65.         android:ems="10" />  
  66.   
  67.     <TextView  
  68.         android:id="@+id/textView3"  
  69.         android:layout_width="wrap_content"  
  70.         android:layout_height="wrap_content"  
  71.         android:layout_alignParentLeft="true"  
  72.         android:layout_below="@+id/editText2"  
  73.         android:text="备注" />  
  74.   
  75.     <EditText  
  76.         android:id="@+id/editText3"  
  77.         android:layout_width="wrap_content"  
  78.         android:layout_height="wrap_content"  
  79.         android:layout_alignParentLeft="true"  
  80.         android:layout_alignParentRight="true"  
  81.         android:layout_below="@+id/textView3"  
  82.         android:lines="5"  
  83.         android:ems="10"  
  84.         android:inputType="textMultiLine" />  
  85.   
  86.     <Button  
  87.         android:id="@+id/button2"  
  88.         android:layout_width="wrap_content"  
  89.         android:layout_height="wrap_content"  
  90.         android:layout_alignParentBottom="true"  
  91.         android:layout_alignParentLeft="true"  
  92.         android:layout_alignParentRight="true"  
  93.         android:text="查看" />  
  94.   
  95.     <Button  
  96.         android:id="@+id/button1"  
  97.         android:layout_width="wrap_content"  
  98.         android:layout_height="wrap_content"  
  99.         android:layout_alignParentLeft="true"  
  100.         android:layout_alignParentRight="true"  
  101.         android:layout_below="@+id/editText3"  
  102.         android:text="插入" />  
  103.   
  104. </RelativeLayout>  
  105. 用一个Person类来封装姓名,性别,电话,备注这些数据。里面只有get()和set()方法  
[java]  view plain  copy
 
  1. package com.example.mode;  
  2.   
  3. public class Person {  
  4.     private String name;  
  5.     private String sex;  
  6.     private String number;  
  7.     private String desc;  
  8.     private int _id;  
  9.       
  10.     public int get_id() {  
  11.         return _id;  
  12.     }  
  13.     public void set_id(int _id) {  
  14.         this._id = _id;  
  15.     }  
  16.     public String getName() {  
  17.         return name;  
  18.     }  
  19.     public void setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.     public String getSex() {  
  23.         return sex;  
  24.     }  
  25.     public void setSex(String sex) {  
  26.         this.sex = sex;  
  27.     }  
  28.     public String getNumber() {  
  29.         return number;  
  30.     }  
  31.     public void setNumber(String number) {  
  32.         this.number = number;  
  33.     }  
  34.     public String getDesc() {  
  35.         return desc;  
  36.     }  
  37.     public void setDesc(String desc) {  
  38.         this.desc = desc;  
  39.     }  
  40.       
  41.       
  42. }  
  43.   
  44. 查看数据的ResultActivity  
[java]  view plain  copy
 
  1. package com.example.phonebooks;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.Activity;  
  7. import android.app.AlertDialog;  
  8. import android.content.Context;  
  9. import android.content.DialogInterface;  
  10. import android.content.DialogInterface.OnClickListener;  
  11. import android.database.Cursor;  
  12. import android.os.Bundle;  
  13. import android.view.LayoutInflater;  
  14. import android.view.View;  
  15. import android.view.ViewGroup;  
  16. import android.widget.AdapterView;  
  17. import android.widget.AdapterView.OnItemClickListener;  
  18. import android.widget.BaseAdapter;  
  19. import android.widget.ListView;  
  20. import android.widget.TextView;  
  21.   
  22. import com.example.mode.Person;  
  23. import com.example.utils.DBHelper;  
  24.   
  25. public class ResultActivity extends Activity implements OnItemClickListener{  
  26.     private ListView listView;  
  27.     private DbAdapter adapter;  
  28.     DBHelper dbHelper;  
  29.     List<Person> bookList = new ArrayList<Person>();  
  30.   
  31.     @Override  
  32.     protected void onCreate(Bundle savedInstanceState) {  
  33.         super.onCreate(savedInstanceState);  
  34.         setContentView(R.layout.result);  
  35.           
  36.         //获取ListView  
  37.         listView = (ListView)findViewById(R.id.listView1);  
  38.         bookList = queryData();  
  39.         //实例化DbAdapter  
  40.         adapter = new DbAdapter(getApplication(), bookList);  
  41.         listView.setAdapter(adapter);  
  42.         listView.setOnItemClickListener(this);  
  43.           
  44.     }  
  45.   
  46.       
  47.     //查询数据库,将每一行的数据封装成一个person 对象,然后将对象添加到List中  
  48.     private List<Person> queryData(){  
  49.         List<Person> list = new ArrayList<Person>();  
  50.         dbHelper = new DBHelper(this);  
  51.           
  52.         //调用query()获取Cursor  
  53.         Cursor c = dbHelper.query();  
  54.         while (c.moveToNext()){  
  55.             int _id = c.getInt(c.getColumnIndex("_id"));  
  56.             String name = c.getString(c.getColumnIndex("name"));  
  57.             String sex = c.getString(c.getColumnIndex("sex"));  
  58.             String number = c.getString(c.getColumnIndex("number"));  
  59.             String desc = c.getString(c.getColumnIndex("desc"));  
  60.   
  61.             //用一个Person对象来封装查询出来的数据  
  62.             Person p = new Person();  
  63.             p.set_id(_id);  
  64.             p.setName(name);  
  65.             p.setSex(sex);  
  66.             p.setNumber(number);  
  67.             p.setDesc(desc);  
  68.               
  69.             list.add(p);  
  70.         }  
  71.         return list;  
  72.     }  
  73.       
  74.       
  75.     //自定义DbAdapter  
  76.     public class DbAdapter extends BaseAdapter{  
  77.         private List<Person> list;  
  78.         private Context context;  
  79.         private LayoutInflater layoutInflater;  
  80.           
  81.         public DbAdapter(Context context, List<Person> list){  
  82.             layoutInflater = LayoutInflater.from(context);  
  83.             this.context = context;  
  84.             this.list = list;  
  85.         }  
  86.           
  87.         //刷新适配器  
  88.         public void refresh(List<Person> list){  
  89.             this.list = list;  
  90.             notifyDataSetChanged();  
  91.         }  
  92.   
  93.         @Override  
  94.         public int getCount() {  
  95.             return list.size();  
  96.         }  
  97.   
  98.         @Override  
  99.         public Object getItem(int position) {  
  100.             return list.get(position);  
  101.         }  
  102.   
  103.         @Override  
  104.         public long getItemId(int position) {  
  105.             return position;  
  106.         }  
  107.   
  108.         @Override  
  109.         public View getView(int position, View convertView, ViewGroup parent) {  
  110.             Person p = list.get(position);  
  111.             ViewHolder holder;  
  112.               
  113.             if(convertView == null){  
  114.                 holder = new ViewHolder();  
  115.                 convertView = layoutInflater.inflate(R.layout.item, null);  
  116.                 holder.name = (TextView)convertView.findViewById(R.id.textView1);  
  117.                 holder.sex = (TextView)convertView.findViewById(R.id.textView2);  
  118.                 holder.number = (TextView)convertView.findViewById(R.id.textView3);  
  119.                 holder.desc = (TextView)convertView.findViewById(R.id.textView4);  
  120.                   
  121.                 convertView.setTag(holder);  
  122.   
  123.             }else{  
  124.                 holder = (ViewHolder) convertView.getTag();  
  125.             }  
  126.               
  127.             holder.name.setText(p.getName());  
  128.             holder.sex.setText(p.getSex());  
  129.             holder.number.setText(p.getNumber());  
  130.             holder.desc.setText(p.getDesc());  
  131.               
  132.             return convertView;  
  133.         }  
  134.           
  135.           
  136.         public class ViewHolder {  
  137.             public TextView name;  
  138.             public TextView sex;   
  139.             public TextView number;  
  140.             public TextView desc;  
  141.             public TextView id;  
  142.         }  
  143.           
  144.     }  
  145.       
  146.   
  147.     @Override  
  148.     public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {  
  149.         final Person p = bookList.get(position);  
  150.         final long temp = id;  
  151.         AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  152.         builder.setMessage("真的要删除该记录?").setPositiveButton("是"new OnClickListener() {  
  153.             @Override  
  154.             public void onClick(DialogInterface dialog, int which) {  
  155.                 //调用delete()删除某条数据  
  156.                 dbHelper.delete(p.get_id());  
  157.                 //重新刷新适配器  
  158.                 adapter.refresh(queryData());  
  159.             }  
  160.         }).setNegativeButton("否"new OnClickListener() {  
  161.               
  162.             @Override  
  163.             public void onClick(DialogInterface dialog, int which) {  
  164.                   
  165.             }  
  166.         }).create().show();  
  167.           
  168.           
  169.         // 关闭数据库  
  170.         dbHelper.close();  
  171.     }  
  172. }  
  173.   
  174. 显示数据的布局result.xml,里面只有一个ListView  
[html]  view plain  copy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent" >  
  5.   
  6.     <ListView  
  7.         android:id="@+id/listView1"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="fill_parent"  
  10.         android:layout_alignParentLeft="true"  
  11.         android:cacheColorHint="#00000000"  
  12.         android:layout_alignParentTop="true" >  
  13.     </ListView>  
  14.   
  15. </RelativeLayout>  

ListView 的item

[html]  view plain  copy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent" >  
  5.   
  6.     <TextView  
  7.         android:id="@+id/textView1"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_alignParentLeft="true"  
  11.         android:layout_alignParentTop="true"  
  12.         android:text="TextView" />  
  13.   
  14.     <TextView  
  15.         android:id="@+id/textView3"  
  16.         android:layout_width="wrap_content"  
  17.         android:layout_height="wrap_content"  
  18.         android:layout_above="@+id/textView4"  
  19.         android:layout_alignParentRight="true"  
  20.         android:text="TextView" />  
  21.   
  22.     <TextView  
  23.         android:id="@+id/textView2"  
  24.         android:layout_width="wrap_content"  
  25.         android:layout_height="wrap_content"  
  26.         android:layout_above="@+id/textView4"  
  27.         android:layout_centerHorizontal="true"  
  28.         android:text="TextView" />  
  29.   
  30.     <TextView  
  31.         android:id="@+id/textView4"  
  32.         android:layout_width="wrap_content"  
  33.         android:layout_height="wrap_content"  
  34.         android:layout_alignParentLeft="true"  
  35.         android:layout_alignParentRight="true"  
  36.         android:layout_below="@+id/textView1"  
  37.         android:layout_marginTop="19dp"  
  38.         android:text="TextView" />  
  39.   
  40. </RelativeLayout>  
[html]  view plain  copy
 
  1. 主要不要忘了在AndroidManifest.xml 注册ResultActivity  


你可能感兴趣的:(Android SQLiteDatabase)