除了前面给大家介绍的execSQL()和rawQuery()方法, SQLiteDatabase还专门提供了对应于添加、删除、更新、查询的操作方法:
Insert()方法用于添加数据,各个字段的数据使用ContentValues进行存放。
ContentValues类似于MAP,相对于MAP,它提供了存取数据对应的put(String key, Xxx value)和getAsXxx(String key)方法, key为字段名称,value为字段值,Xxx指的是各种常用的数据类型,如:String、Integer等。
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "传智播客");
values.put("age", 4);
long rowid = db.insert(“person”, null, values);//返回新添记录的行号,与主键id无关
不管第三个参数是否包含数据,执行Insert()方法必然会添加一条记录,如果第三个参数为空,会添加一条除主键之外其他字段值为Null的记录。
Insert()方法内部实际上通过构造insert语句完成数据的添加,Insert()方法的第二个参数用于指定空值字段的名称,相信大家对此参数会感到疑惑,此参数的作用是干嘛的?
是这样的:如果第三个参数values 为Null或者元素个数为0, Insert()方法必然要添加一条除了主键之外其它字段为Null值的记录,为了满足这条insert语句的语法, insert语句必须给定一个字段名,如:insert into person(name) values(NULL),倘若不给定字段名 , insert语句就成了这样: insert into person() values(),显然这不满足标准SQL的语法。
对于字段名,建议使用主键之外的字段,如果使用了INTEGER类型的主键字段,执行类似insert into person(personid) values(NULL)的insert语句后,该主键字段值也不会为NULL。如果第三个参数values 不为Null并且元素的个数大于0 ,可以把第二个参数设置为null。
delete()方法的使用:
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.delete("person", "personid<?", new String[]{"2"});
db.close();
上面代码用于从person表中删除personid小于2的记录。
update()方法的使用:
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(“name”, “CSDN”);//key为字段名,value为值
db.update("person", values, "personid=?", new String[]{"1"});
db.close();
上面代码用于把person表中personid等于1的记录的name字段的值改为“传智播客”。
query()方法实际上是把select语句拆分成了若干个组成部分,然后作为方法的输入参数:
SQLiteDatabase db = databaseHelper.getWritableDatabase();
Cursor cursor = db.query("person", new String[]{"personid,name,age"}, "name like ?", new String[]{"%CSDN%"}, null, null, "personid desc", "1,2");
while (cursor.moveToNext()) {
int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始
String name = cursor.getString(1);//获取第二列的值
int age = cursor.getInt(2);//获取第三列的值
}
cursor.close();
db.close();
上面代码用于从person表中查找name字段含有“传智”的记录,匹配的记录按personid降序排序,对排序后的结果略过第一条记录,只获取2条记录。
query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)方法各参数的含义:
这些方法实际上是给那些不太了解SQL语法的菜鸟使用的,对于熟悉SQL语法的程序员而言,直接使用execSQL()和rawQuery()方法执行SQL语句就能完成数据的添加、删除、更新、查询操作。
package com.example.lession04_db.domain; import java.io.Serializable; public class PersonSecond implements Serializable { /** * 封装的数据库实体bean * @author zhaoyazhi */ private static final long serialVersionUID = 1L; private Integer id; private String name; private String phone; public PersonSecond() { super(); // TODO Auto-generated constructor stub } public PersonSecond(Integer id, String name, String phone) { super(); this.id = id; this.name = name; this.phone = phone; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", phone=" + phone + "]"; } }
package com.example.lession04_db.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class DBSQLiteOpenHelper extends SQLiteOpenHelper{ private static final String TAG = "DBSQLiteOpenHelper"; //数据库名称 private static final String name="csdnsecond.db"; //数据库的版本 private static final int version=1; public DBSQLiteOpenHelper(Context context) { super(context, name, null, version); Log.v(TAG,"构造器执行的操作"); } /** * 当第一次创建数据库的时候 执行的方法 */ @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table person(id integer primary key autoincrement,name varchar(20),phone varchar(20))"); Log.v(TAG,"数据库创建的时候执行"); } /** * 当数据库更新(版本变化)的时候 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.v(TAG, "数据库版本发生变化的时候执行"); } }
package com.example.lession04_db.dao; import java.util.List; import com.example.lession04_db.domain.PersonSecond; import android.R.bool; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public interface PersonDaoSecond { /** * 执行插入操作 * @param db * @param values * @return */ public boolean insert( ContentValues values); /** * 执行更新操作 * @param db * @param values * @return */ public boolean update( ContentValues values,Integer id); /** * 根据id删除实体对象 * @param db * @param id * @return */ public boolean delete(Integer id); /** * 查询所有 * @param db * @return */ public List<PersonSecond> findAll(); /** * 条件查询操作 * @param db * @param selectionArgs * @return */ public List<PersonSecond> findByName(String[] selectionArgs); /** * 获取当前页信息 * @param db * @param selectionArgs * @param order * @param limit * @return */ public List<PersonSecond> getNowPageInfo(String[] selectionArgs,String order,String limit); Cursor findAlls(); Cursor findById(Integer id); Cursor findByNames(String name); }
package com.example.lession04_db.dao; import java.util.ArrayList; import java.util.List; import com.example.lession04_db.db.DBSQLiteOpenHelper; import com.example.lession04_db.domain.PersonSecond; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class PersonDaoSecondImpl implements PersonDaoSecond { private DBSQLiteOpenHelper dbsqLiteOpenHelper; public PersonDaoSecondImpl(Context context) { super(); dbsqLiteOpenHelper = new DBSQLiteOpenHelper(context); } @Override public boolean insert(ContentValues values) { SQLiteDatabase db = dbsqLiteOpenHelper.getWritableDatabase(); boolean flag = false; if (db.isOpen()) { // 执行插入操作 long l = db.insert("person", null, values); if (l > 0) { flag = true; } db.close(); } return flag; } @Override public boolean update(ContentValues values, Integer id) { SQLiteDatabase db = dbsqLiteOpenHelper.getWritableDatabase(); boolean flag = false; if (db.isOpen()) { // 执行插入操作 int l = db.update("person", values, "id=?", new String[] { id + "" }); if (l > 0) { flag = true; } db.close(); } return flag; } @Override public boolean delete(Integer id) { SQLiteDatabase db = dbsqLiteOpenHelper.getWritableDatabase(); boolean flag = false; if (db.isOpen()) { // 执行插入操作 int l = db.delete("person", "id=?", new String[] { id + "" }); if (l > 0) { flag = true; } db.close(); } return flag; } @Override public List<PersonSecond> findAll() { SQLiteDatabase db = dbsqLiteOpenHelper.getReadableDatabase(); List<PersonSecond> persons = new ArrayList<PersonSecond>(); if (db.isOpen()) { // 执行查询 Cursor cursor = db.query("person", new String[] { "id", "name", "phone" }, null, null, null, null, null); while (cursor.moveToNext()) { // 创建person对象 PersonSecond person = new PersonSecond(); // 设置person的属性 person.setId(cursor.getInt(cursor.getColumnIndex("id"))); person.setName(cursor.getString(cursor.getColumnIndex("name"))); person.setPhone(cursor.getString(cursor.getColumnIndex("phone"))); // 添加到集合众 persons.add(person); } } return persons; } @Override public List<PersonSecond> findByName(String[] selectionArgs) { SQLiteDatabase db = dbsqLiteOpenHelper.getReadableDatabase(); List<PersonSecond> persons = new ArrayList<PersonSecond>(); if (db.isOpen()) { // 执行查询 Cursor cursor = db.query("person", new String[] { "id", "name", "phone" }, "name like ?", selectionArgs, null, null, "id desc"); while (cursor.moveToNext()) { // 创建person对象 PersonSecond person = new PersonSecond(); // 设置person的属性 person.setId(cursor.getInt(cursor.getColumnIndex("id"))); person.setName(cursor.getString(cursor.getColumnIndex("name"))); person.setPhone(cursor.getString(cursor.getColumnIndex("phone"))); // 添加到集合众 persons.add(person); } } return persons; } @Override public List<PersonSecond> getNowPageInfo(String[] selectionArgs, String order, String limit) { SQLiteDatabase db = dbsqLiteOpenHelper.getReadableDatabase(); List<PersonSecond> persons = new ArrayList<PersonSecond>(); if (db.isOpen()) { // 执行查询 Cursor cursor = db.query("person", new String[] { "id", "name", "phone" }, "name like ?", selectionArgs, null, null, order, limit); while (cursor.moveToNext()) { // 创建person对象 PersonSecond person = new PersonSecond(); // 设置person的属性 person.setId(cursor.getInt(cursor.getColumnIndex("id"))); person.setName(cursor.getString(cursor.getColumnIndex("name"))); person.setPhone(cursor.getString(cursor.getColumnIndex("phone"))); // 添加到集合众 persons.add(person); } } return persons; } @Override public Cursor findAlls() { SQLiteDatabase db = dbsqLiteOpenHelper.getReadableDatabase(); if (db.isOpen()) { return db.rawQuery("select id as _id,name,phone from person", null); } return null; } @Override public Cursor findById(Integer id) { SQLiteDatabase db = dbsqLiteOpenHelper.getReadableDatabase(); if (db.isOpen()) { return db.rawQuery("select id ,name,phone from person where id = ?", new String[]{id+""}); } return null; } public Cursor findByNames(String name) { SQLiteDatabase db = dbsqLiteOpenHelper.getReadableDatabase(); if (db.isOpen()) { // 执行查询 Cursor c = db.rawQuery("select id,name,phone from person where name like ?",new String[]{name}); return c; } return null; } }
这些方法实际上是给那些不太了解SQL语法的菜鸟使用的,对于熟悉SQL语法的程序员而言,直接使用execSQL()和rawQuery()方法执行SQL语句就能完成数据的添加、删除、更新、查询操作。 package com.example.lession04_db.test; import java.util.List; import android.content.ContentValues; import android.database.sqlite.SQLiteDatabase; import android.test.AndroidTestCase; import android.util.Log; import com.example.lession04_db.dao.PersonDaoSecond; import com.example.lession04_db.dao.PersonDaoSecondImpl; import com.example.lession04_db.db.DBSQLiteOpenHelper; import com.example.lession04_db.domain.PersonSecond; public class DBPersonTest extends AndroidTestCase { private static final String TAG = "DBPersonTest"; // 创建Dao对象 private PersonDaoSecond personDao; public void createDB() { DBSQLiteOpenHelper helper = new DBSQLiteOpenHelper(getContext()); helper.getWritableDatabase(); } public void insert() { personDao = new PersonDaoSecondImpl(getContext()); for (int i = 3; i < 120; i++) { // 参数 ContentValues values = new ContentValues(); // 创建person实体对象 PersonSecond person = new PersonSecond(null, "zyz" + i, "13912312" + i); // 调用put方法存值 values.put("name", person.getName()); values.put("phone", person.getPhone()); // 执行插入 personDao.insert(values); } } public void update() { personDao = new PersonDaoSecondImpl(getContext()); // 参数 ContentValues values = new ContentValues(); // 创建person实体对象 PersonSecond person = new PersonSecond(1, "xxxzxxx", "15028253905"); // 调用put方法存值 values.put("name", person.getName()); values.put("phone", person.getPhone()); // 执行插入 personDao.update(values, person.getId()); } public void delete() { personDao = new PersonDaoSecondImpl(getContext()); // 创建person实体对象 PersonSecond person = new PersonSecond(1, "xxxzxxx", "15028253905"); // 执行插入 personDao.delete(person.getId()); } public void findAll() { personDao = new PersonDaoSecondImpl(getContext()); List<PersonSecond> persons = personDao.findAll(); for (PersonSecond p : persons) { Log.v(TAG, p.toString()); } } public void findByName() { personDao = new PersonDaoSecondImpl(getContext()); List<PersonSecond> persons = personDao .findByName(new String[] { "%z1%" }); for (PersonSecond p : persons) { Log.v(TAG, p.toString()); } } public void getNowPageInfo() { personDao = new PersonDaoSecondImpl(getContext()); List<PersonSecond> persons = personDao.getNowPageInfo( new String[] { "%z1%" }, "id desc", "0,5"); for (PersonSecond p : persons) { Log.v(TAG, p.toString()); } } }