上一讲中我们讲到了SQLite数据库的操作方法 [数据存储之SQLite数据库操作(二)],我们主要是以SQL语句对数据库进行增删改查,这一讲我们来学习一下 Android 建议的对数据库的操作方法
查看 SQLiteDatabase 中,在上一讲中有讲到 execSQL (String sql,Object[] bindArgs) 这个方法,在这里Android建议我们在操纵数据库的时候用以下几种方式:
1) 插入:
insert(String,String,ContentValues)
insertOrThrow(String,ContentValues)
insertWithOnConflict(String,ContentValues,int)
2) 更新:
update(String,String[])
updateWithOnConflict(String,String[],int) 3) 删除:
delete(String,String[])
[注]这一讲中我们就来使用Android推荐的这些操作数据库的方法来进行数据库的操作,Demo 还是与上一讲类似,读者可以结合上一讲内容来学习,对比之间的不同。
1. 方法概要
1) 查看API文档 SQLiteDatabase 中的 public long insert (String table,String nullColumnHack,ContentValues values) 插入一行数据到数据库中
参数:
table :
需要插入行的表的名称
nullColumnHack :
这个参数是可选的,可以为null,SQL 不允许插入一个至少一列都不命名的完全空的行。如果你提供的 values 是空的,而且 没有已知的的列名,这就是一个空行,这是不能被插入的。如果设置非空,nullColumnHack 参数提供一个可为空的列的名称,当插入的 values 是空的时候,就将这个列名置为NULL,然后values值插入。
values :
指定行对应的列的值,这个类型很类似Map,key表示列的名称,values表示列的值
返回值:
返回新插入的行的ID,如果存在错误默认返回 -1
[备注]第二个参数翻译的有些拘谨,我们可以这样理解
当在没有任何已知的列名的情况下,values参数为空的时候,insert是会失败的(数据库不允许插入一个空行),为了防止Insert()方法要求必须添加一条除了主键之外其它字段为Null值的记录,我们要在这里必须指定一个列名[因为values值是以ContentValues 的形式来存储的],到时候如果发现将要插入的行为空行时,就会将你指定的这个列名的值设为null,然后再将values值向NULL列中插入。查看源代码,我们可以发现 Android 中操作数据库的方法底层也是通过构造SQL语句来实现的。
2)查看API文档SQLiteDatabase 中的 public int delete (String table,String whereClause,String[] whereArgs) 删除操作
参数:
table :表示表名
whereClause :
可选项,是可以通过 SQL语句中where语句来过滤条件删除的条目,如果是null 表示删除所有行
whereArgs :
紧跟第二个参数,作为删除过滤条件的占位符,详情请看下面程序 PersonDao2 的 deletePerson() 方法的操作。
返回值:
如果是 0 表示未删除任何行,如果已经有删除行的操作 会得到 count > 0的数,表示删除的行数
3)查看API文档SQLiteDatabase 中的
public int update (String table,ContentValues values,String[] whereArgs)
更新操作
参数 :
table :
表示表名
values :Map 中指定列名用来更新新的值,如果是null 值则为修改为 NULL
whereClause :可选项,支持SQL中的更新语句,用来做条件过滤,如果设置null 则会更新所有行
whereArgs :紧跟第二个参数,作为更新过滤条件的占位符,详情请看下面程序 PersonDao2 的updatePerson() 方法的操作。
返回值:
返回所更新的数据库的行数
4)查看API文档SQLiteDatabase 中的
查询操作 query(),可以发现 SQLiteDatabase 中有大量的 query() 查询的重载方法,其实这边它不管怎么重载,都是遵循 SQL 语句来的这里我就剖析一个最为常见的查询方法,其他的读者自己查看文档说明.
public Cursor query (boolean distinct,String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit)
参数:
distinct :
判断是否返回的行是唯一值,如果想要返回唯一的行,则为true,否则为false。
table :
需要查询的表的名称。
columns :
需要返回的列,如果要返回所有列则置为null。
selection :
过滤需要返回的行,格式遵从SQL中 SQL WHERE 语句(除了Where关键字以外).如果返回给定表的所有行,则置为Null。
selectionArgs :过滤条件的占位符,这里的值会代替过滤语句中 "?"。
groupBy :
过滤条件对行进行分组,格式遵从SQL中 SQL GROUP BY 语句 (除了关键字GROUP BY之外),如果不分组,置为Null。
having :
对分组过滤条件的占位符操作。
orderBy :
如何进行排序,遵从SQL中的SQL ORDER BY 语句,如果是null表示使用默认的排序顺序。
limit :是否对数据库进行分页的查询。
返回值:
它返回的是一个游标,这个用法之前有讲过,不懂的可以查看前面几讲内容的介绍
2. 代码实现
1) 程序布局文件 activity_main.xml,这里只是定义了几个按钮,就不贴出来了
2) DBOpenHelper.java 用来创建数据库使用
[java]
view plain
copy
- packagecom.android.sqlitedemo.db;
-
- importandroid.content.Context;
- importandroid.database.sqlite.SQLiteDatabase;
- importandroid.database.sqlite.SQLiteOpenHelper;
- publicclassDBOpenHelperextendsSQLiteOpenHelper{
- privatestaticStringname="mydb.db";
- staticintversion=1;
-
- publicDBOpenHelper(Contextcontext){
- super(context,name,null,version);
-
- }
-
- @Override
- voidonCreate(SQLiteDatabasedb){
- //TODOAuto-generatedmethodstub
- //SQLite数据创建支持的数据类型:整型数据,字符串类型,日期类型,二进制的数据类型
- //数据库这边有一个特点,就是SQLite数据库中文本类型没有过多的约束,也就是可以把布尔类型的数据存储到文本类型中,这样也是可以的
- Stringsql="createtableperson(idintegerprimarykeyautoincrement,namevarchar(64),addressvarchar(64),sexvarchar(8))";
- db.execSQL(sql);
- @Override
- voidonUpgrade(SQLiteDatabasedb,153); font-weight:bold; background-color:inherit">intoldVersion,153); font-weight:bold; background-color:inherit">intnewVersion){
- //TODOAuto-generatedmethodstub
- }
- }
3) PersonService2.java 定义操作数据库(增删改查)的接口
copy
packagecom.android.sqlitedemo.service;
- importandroid.content.ContentValues;
- importjava.util.List;
- importjava.util.Map;
- /**
- *定义好增删改查接口
- *@authorxukunhui
- *
- */
- interfacePersonService2{
- booleanaddPersion(ContentValuesvalues);
- booleandeletePerson(StringwhereClause,String[]whereArgs);
- booleanupdatePerson(ContentValuesvalues,StringwhereClause,0); background-color:inherit">//使用Map<String,String>做一个封装,比如说查询数据库的时候返回的单条记录
- publicMap<String,String>viewPerson(Stringselection,String[]selectionArgs);
- //使用List<Map<String,String>>做一个封装,比如说查询数据库的时候返回的多条记录
- publicList<Map<String,String>>listPersonMaps(Stringselection,String[]selectionArgs);
- }
3) PersonDao2.java 实现操作数据库的增删改查的功能
copy
packagecom.android.sqlitedemo.dao;
- importandroid.content.Context;
- importandroid.database.Cursor;
- importcom.android.sqlitedemo.db.DBOpenHelper;
- importcom.android.sqlitedemo.service.PersonService2;
- importjava.util.ArrayList;
- importjava.util.HashMap;
- classPersonDao2implementsPersonService2{
- privateDBOpenHelperhelper=null;
- publicPersonDao2(Contextcontext){
- helper=newDBOpenHelper(context);
- booleanaddPersion(ContentValuesvalues){
- booleanflag=false;
- SQLiteDatabasedatabase=longid=-1;
- try{
- database=helper.getWritableDatabase();
- id=database.insert("person",values);
- flag=(id!=-1?true:false);
- }catch(Exceptione){
- //TODO:handleexception
- finally{
- if(database!=null){
- database.close();
- returnflag;
- intcount=0;
- count=database.delete("person",whereClause,whereArgs);
- flag=(count>0?0;
- count=database.update("person",values,0); background-color:inherit">//查询单条记录
- //select*from
- //*表示返回的列的名称(投影查询)from
- Cursorcursor=null;
- Map<String,String>map=newHashMap<String,String>();
- try{
- database=helper.getReadableDatabase();
- cursor=database.query(true,"person",selection,selectionArgs,
- null);
- intcols_len=cursor.getColumnCount();
- while(cursor.moveToNext()){
- for(inti=0;i<cols_len;i++){
- Stringcols_name=cursor.getColumnName(i);
- Stringcols_values=cursor.getString(cursor.getColumnIndex(cols_name));
- if(cols_values==null){
- cols_values="";
- map.put(cols_name,cols_values);
- e.printStackTrace();
- }finally{
- database.close();
- returnmap;
- //查询多条记录
- SQLiteDatabasedatabase= Cursorcursor= List<Map<String,String>>list=newArrayList<Map<String,String>>();
- database=helper.getReadableDatabase();
- cursor=database.query(false,
- //查询所有记录,所以有重复的数据也要全部检出,所以第一参数置为false.
- intcols_len=cursor.getColumnCount();
- while(cursor.moveToNext()){
- list.add(map);
- catch(Exceptione){
- //TODO:handleexception
- e.printStackTrace();
- returnlist;
- }
4) MainActivity.java 点击按钮触发操作数据的事件
copy
packagecom.android.sqlitedemo;
- importcom.android.sqlitedemo.dao.PersonDao2;
- importcom.android.sqlitedemo.db.DBOpenHelper;
- importcom.android.sqlitedemo.service.PersonService2;
- importandroid.os.Bundle;
- importandroid.app.Activity;
- importandroid.content.ContentValues;
- importandroid.util.Log;
- importandroid.view.Menu;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- classMainActivityextendsActivity{
- privateButtonbutton1;
- privateButtonbutton2;
- privateButtonbutton3;
- privateButtonbutton4;
- privateButtonbutton5;
- privateButtonbutton6;
- finalStringTAG="MainActivity";
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initComponent();
- button1.setOnClickListener(newOnClickListener(){
- voidonClick(Viewv){
- DBOpenHelperhelper=newDBOpenHelper(MainActivity.this);
- //调用getWritableDatabase()或者getReadableDatabase()其中一个方法将数据库建立
- helper.getWritableDatabase();
- });
- button2.setOnClickListener( PersonService2service2=newPersonDao2(MainActivity. ContentValuesvalues=newContentValues();
- values.put("name","AHuier");
- values.put("address","XIAMEN");
- values.put("sex","male");
- booleanflag=service2.addPersion(values);
- Log.i(TAG,"----addPersion--->"+flag);
- button3.setOnClickListener(voidonClick(Viewv){
- //删除的SQL语句:deletefrompersonwhereid=?
- //不包含where关键字
- booleanflag=service2.deletePerson("id=?",153); font-weight:bold; background-color:inherit">newString[]{
- "4"
- });
- "----deletePerson---->"+flag);
- button4.setOnClickListener("female");
- booleanflag=service2.updatePerson(values,"id=?",248)"> "1"
- "----updatePerson--->"+flag);
- button5.setOnClickListener( PersonService2service2=this);
- "id=?",153); font-weight:bold; background-color:inherit">newString[]{"2"});
- Log.i(TAG,"----viewPerson--->"+map.toString());
- button6.setOnClickListener(newOnClickListener(){
- //select*fromperson
- List<Map<String,String>>list=service2.listPersonMaps(null);
- "----viewPerson--->"+list.toString());
- booleanonCreateOptionsMenu(Menumenu){
- //Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
- getMenuInflater().inflate(R.menu.main,menu);
- returntrue;
- voidinitComponent(){
- button1=(Button)findViewById(R.id.button1);
- button2=(Button)findViewById(R.id.button2);
- button3=(Button)findViewById(R.id.button3);
- button4=(Button)findViewById(R.id.button4);
- button5=(Button)findViewById(R.id.button5);
- button6=(Button)findViewById(R.id.button6);
- }
3. 程序执行过程
1) 插入数据
2) 删除ID = 4 的数据
3) 修改ID = 1 的数据
4) 返回查询的单条记录和多条记录
地址:http://download.csdn.net/category (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|