查看 sqliteDatabase 中,在上一讲中有讲到 execsql (String sql,Object[] bindArgs) 这个方法,在这里AndroID建议我们在 *** 纵数据库的时候用以下几种方式:
1) 插入: insert(String,String,ContentValues) insertOrThrow(String,ContentValues) insertWithOnConflict(String,ContentValues,int)1. 方法概要 1) 查看api文档 sqliteDatabase 中的
2) 更新: update(String,String[]) updateWithOnConflict(String,String[],int)
3) 删除: delete(String,String[])
[注]这一讲中我们就来使用AndroID推荐的这些 *** 作数据库的方法来进行数据库的 *** 作,Demo 还是与上一讲类似,读者可以结合上一讲内容来学习,对比之间的不同。
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 语句来的这里我就剖析一个最为常见的查询方法,其他的读者自己查看文档说明.
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. 代码实现
3. 程序执行过程1) 程序布局文件 activity_main.xml,这里只是定义了几个按钮,就不贴出来了
2) DBOpenHelper.java 用来创建数据库使用
package com.androID.sqlitedemo.db;import androID.content.Context;import androID.database.sqlite.sqliteDatabase;import androID.database.sqlite.sqliteOpenHelper;public class DBOpenHelper extends sqliteOpenHelper { private static String name = "mydb.db"; // 表示数据库的名称 private static int version = 1; // 表示数据库的版本号 public DBOpenHelper(Context context) { super(context,name,null,version); // Todo auto-generated constructor stub } // 当数据库创建的时候,是第一次被执行,完成对数据库的表的创建 @OverrIDe public voID onCreate(sqliteDatabase db) { // Todo auto-generated method stub // sqlite 数据创建支持的数据类型: 整型数据,字符串类型,日期类型,二进制的数据类型 // 数据库这边有一个特点,就是sqlite数据库中文本类型没有过多的约束,也就是可以把布尔类型的数据存储到文本类型中,这样也是可以的 String sql = "create table person(ID integer primary key autoincrement,name varchar(64),address varchar(64),sex varchar(8))"; db.execsql(sql); // 完成数据库的创建 } @OverrIDe public voID onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) { // Todo auto-generated method stub }}3) PersonService2.java 定义 *** 作数据库(增删改查)的接口package com.androID.sqlitedemo.service;import androID.content.ContentValues;import java.util.List;import java.util.Map;/** * 定义好增删改查接口 * @author xukunhui * */public interface PersonService2 { public boolean addPersion(ContentValues values); public boolean deletePerson(String whereClause,String[] whereArgs); public boolean updatePerson(ContentValues values,String[] whereArgs); //使用 Map<String,String> 做一个封装,比如说查询数据库的时候返回的单条记录 public Map<String,String> vIEwPerson(String selection,String[] selectionArgs); //使用 List<Map<String,String>> 做一个封装,比如说查询数据库的时候返回的多条记录 public List<Map<String,String>> ListPersonMaps(String selection,String[] selectionArgs);}3) PersonDao2.java 实现 *** 作数据库的增删改查的功能package com.androID.sqlitedemo.dao;import androID.content.ContentValues;import androID.content.Context;import androID.database.Cursor;import androID.database.sqlite.sqliteDatabase;import com.androID.sqlitedemo.db.DBOpenHelper;import com.androID.sqlitedemo.service.PersonService2;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class PersonDao2 implements PersonService2 { private DBOpenHelper helper = null; public PersonDao2(Context context) { helper = new DBOpenHelper(context); } @OverrIDe public boolean addPersion(ContentValues values) { // Todo auto-generated method stub boolean flag = false; sqliteDatabase database = null; long ID = -1; try { database = helper.getWritableDatabase(); ID = database.insert("person",values); flag = (ID != -1 ? true : false); } catch (Exception e) { // Todo: handle exception } finally { if (database != null) { database.close(); } } return flag; } @OverrIDe public boolean deletePerson(String whereClause,String[] whereArgs) { // Todo auto-generated method stub boolean flag = false; sqliteDatabase database = null; int count = 0; try { database = helper.getWritableDatabase(); count = database.delete("person",whereClause,whereArgs); flag = (count > 0 ? true : false); } catch (Exception e) { // Todo: handle exception } finally { if (database != null) { database.close(); } } return flag; } @OverrIDe public boolean updatePerson(ContentValues values,String[] whereArgs) { // Todo auto-generated method stub boolean flag = false; sqliteDatabase database = null; int count = 0; // 影响数据库的行数 try { database = helper.getWritableDatabase(); count = database.update("person",values,whereArgs); flag = (count > 0 ? true : false); } catch (Exception e) { // Todo: handle exception } finally { if (database != null) { database.close(); } } return flag; } // 查询单条记录 @OverrIDe public Map<String,String[] selectionArgs) { // Todo auto-generated method stub // select * from // * 表示 返回的列的名称(投影查询) from sqliteDatabase database = null; Cursor cursor = null; Map<String,String> map = new HashMap<String,String>(); try { database = helper.getReadableDatabase(); cursor = database.query(true,"person",selection,selectionArgs,null); //查询单条记录,记录是唯一的,所以第一个参数置为 true. int cols_len = cursor.getColumnCount(); // 获取游标个数,即查询所得的结果数目 while (cursor.movetoNext()) { for (int i = 0; i < cols_len; i++) { String cols_name = cursor.getColumnname(i); String cols_values = cursor.getString(cursor.getColumnIndex(cols_name)); if (cols_values == null) { cols_values = ""; } map.put(cols_name,cols_values); } } } catch (Exception e) { // Todo: handle exception e.printstacktrace(); } finally { if (database != null) { database.close(); } } return map; } // 查询多条记录 @OverrIDe public List<Map<String,String[] selectionArgs) { // Todo auto-generated method stub sqliteDatabase database = null; Cursor cursor = null; List<Map<String,String>> List = new ArrayList<Map<String,String>>(); try { database = helper.getReadableDatabase(); cursor = database.query(false,null); //查询所有记录,所以有重复的数据也要全部检出,所以第一参数置为false. int cols_len = cursor.getColumnCount(); while (cursor.movetoNext()) { Map<String,String>(); for (int i = 0; i < cols_len; i++) { String cols_name = cursor.getColumnname(i); String cols_values = cursor.getString(cursor.getColumnIndex(cols_name)); if (cols_values == null) { cols_values = ""; } map.put(cols_name,cols_values); } List.add(map); } } catch (Exception e) { // Todo: handle exception e.printstacktrace(); } finally { if (database != null) { database.close(); } } return List; }}4) MainActivity.java 点击按钮触发 *** 作数据的事件package com.androID.sqlitedemo;import java.util.List;import java.util.Map;import com.androID.sqlitedemo.dao.PersonDao2;import com.androID.sqlitedemo.db.DBOpenHelper;import com.androID.sqlitedemo.service.PersonService2;import androID.os.Bundle;import androID.app.Activity;import androID.content.ContentValues;import androID.util.Log;import androID.vIEw.Menu;import androID.vIEw.VIEw;import androID.vIEw.VIEw.OnClickListener;import androID.Widget.button;public class MainActivity extends Activity { private button button1; private button button2; private button button3; private button button4; private button button5; private button button6; private static final String TAG = "MainActivity"; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); initComponent(); button1.setonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { // Todo auto-generated method stub DBOpenHelper helper = new DBOpenHelper(MainActivity.this); // 调用 getWritableDatabase()或者 getReadableDatabase()其中一个方法将数据库建立 helper.getWritableDatabase(); } }); button2.setonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { // Todo auto-generated method stub PersonService2 service2 = new PersonDao2(MainActivity.this); ContentValues values = new ContentValues(); values.put("name","AHuIEr"); values.put("address","XIAMEN"); values.put("sex","male"); boolean flag = service2.addPersion(values); Log.i(TAG,"---- addPersion --->" + flag); } }); button3.setonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { PersonService2 service2 = new PersonDao2(MainActivity.this); // 删除的SQL语句 :delete from person where ID = ? // 不包含 where 关键字 boolean flag = service2.deletePerson(" ID = ? ",new String[] { "4" }); Log.i(TAG,"---- deletePerson ---->" + flag); } }); button4.setonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { // Todo auto-generated method stub PersonService2 service2 = new PersonDao2(MainActivity.this); ContentValues values = new ContentValues(); values.put("name","female"); boolean flag = service2.updatePerson(values," ID = ? ",new String[] { "1" }); Log.i(TAG,"---- updatePerson --->" + flag); } }); button5.setonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { PersonService2 service2 = new PersonDao2(MainActivity.this); Map<String,String> map = service2.vIEwPerson(" ID = ? ",new String[] { "2" }); Log.i(TAG,"---- vIEwPerson --->" + map.toString()); } }); button6.setonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { PersonService2 service2 = new PersonDao2(MainActivity.this); // select * from person List<Map<String,String>> List = service2.ListPersonMaps(null,null); Log.i(TAG,"---- vIEwPerson --->" + List.toString()); } }); } @OverrIDe public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main,menu); return true; } private voID initComponent() { 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); }}
1) 插入数据
2) 删除ID = 4 的数据
3) 修改ID = 1 的数据
4) 返回查询的单条记录和多条记录
附该 Demo 的源代码下载地址: http://download.csdn.net/my/uploads
总结以上是内存溢出为你收集整理的【Android 开发】:数据存储之 SQLite 数据库 *** 作(三)全部内容,希望文章能够帮你解决【Android 开发】:数据存储之 SQLite 数据库 *** 作(三)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)