您的位置:首页 > 产品设计 > UI/UE

采用execSQL()和rawQuery()方法完成数据的添删改查

2014-09-02 22:54 363 查看

采用execSQL()和rawQuery()方法完成数据的添删改查

Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。对SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。 execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句; rawQuery()方法用于执行select语句。
execSQL()方法的使用例子:

SQLiteDatabase db = ....;

db.execSQL("insert into person(name, age) values('传智播客', 4)");

db.close();
执行上面SQL语句会往person表中添加进一条记录,在实际应用中, 语句中的“传智播客”这些参数值会由用户输入界面提供,如果把用户输入的内容原样组拼到上面的insert语句, 当用户输入的内容含有单引号时,组拼出来的SQL语句就会存在语法错误。要解决这个问题需要对单引号进行转义,也就是把单引号转换成两个单引号。有些时候用户往往还会输入像“ & ”这些特殊SQL符号,为保证组拼好的SQL语句语法正确,必须对SQL语句中的这些特殊SQL符号都进行转义,显然,对每条SQL语句都做这样的处理工作是比较烦琐的。
SQLiteDatabase类提供了一个重载后的execSQL(String sql, Object[] bindArgs)方法,使用这个方法可以解决前面提到的问题,因为这个方法支持使用占位符参数(?)。使用例子如下:
SQLiteDatabase db = ....;

db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"传智播客", 4});

db.close();
execSQL(String sql, Object[] bindArgs)方法的第一个参数为SQL语句,第二个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。

SQLiteDatabase的rawQuery() 用于执行select语句,使用例子如下:

SQLiteDatabase db = ....;

Cursor cursor = db.rawQuery(“select * from person”, null);

while (cursor.moveToNext()) {

 int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始
 String name = cursor.getString(1);//获取第二列的值
 int age = cursor.getInt(2);//获取第三列的值
}

cursor.close();

db.close();
rawQuery()方法的第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null。带占位符参数的select语句使用例子如下:
Cursor cursor = db.rawQuery("select * from person where name like ? and age=?", new String[]{"%传智%", "4"});

Cursor是结果集游标,用于对结果集进行随机访问,如果大家熟悉jdbc, 其实Cursor与JDBC中的ResultSet作用很相似。使用moveToNext()方法可以将游标从当前行移动到下一行,如果已经移过了结果集的最后一行,返回结果为false,否则为true。另外Cursor 还有常用的moveToPrevious()方法(用于将游标从当前行移动到上一行,如果已经移过了结果集的第一行,返回值为false,否则为true )、moveToFirst()方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为false,否则为true
)和moveToLast()方法(用于将游标移动到结果集的最后一行,如果结果集为空,返回值为false,否则为true ) 。

演示实例

1.创建实体对象javabean

public class Person {

 private Integer id;

 private String name;

 private String phone;

 private Integer amount;

 

 public Integer getAmount() {

  return amount;

 }

 public void setAmount(Integer amount) {

  this.amount = amount;

 }

 public Person(String name, String phone, Integer amount) {

  this.name = name;

  this.phone = phone;

  this.amount = amount;

 }

 public Person(Integer id, String name, String phone, Integer amount) {

  this.id = id;

  this.name = name;

  this.phone = phone;

  this.amount = amount;

 }

2.编写Service实现CRUD

 2.1首先编写初始化数据库的类

public class DBOpenHelper extends SQLiteOpenHelper {

 public DBOpenHelper(Context context) {

  super(context, "itcast.db", null, 3);

 }

 @Override

 public void onCreate(SQLiteDatabase db) { //在数据库第一次被创建时调用
  db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20), phone VARCHAR(12) NULL)");

 }

 @Override

 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

  db.execSQL("ALTER TABLE person ADD amount integer");

 }

}

 2.2编写service

public class PersonService {

 private DBOpenHelper dbOpenHelper;  //声明数据库安装类
 

 public PersonService(Context context){

  dbOpenHelper = new DBOpenHelper(context);   //构造函数,将传入的上下文对象传入数据库安装类,创建数据库
 }

 

 

 public void save(Person person){   //保存方法
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); //获取写入权限的数据库操作对象
  db.execSQL("insert into person(name,phone,amount) values(?,?,?)",

    new Object[]{person.getName(), person.getPhone(), person.getAmount()});
  //db.close();

 }

 

 public void update(Person person){  //更新方法
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();

  db.execSQL("update person set name=?,phone=?,amount=? where personid=?",

    new Object[]{person.getName(), person.getPhone(), person.getAmount(), person.getId()});
 }

 

 public Person find(Integer id){  //查找方法
  SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); //获取只读权限的数据库操作对象
  Cursor cursor = db.rawQuery("select * from person where personid=?", new String[]{id.toString()}); //Cursor查询结果集

  if(cursor.moveToFirst()){

   int personid = cursor.getInt(cursor.getColumnIndex("personid"));  //根据索引获取属性
   int amount = cursor.getInt(cursor.getColumnIndex("amount"));

   String name = cursor.getString(cursor.getColumnIndex("name"));

   String phone = cursor.getString(cursor.getColumnIndex("phone"));

   cursor.close();

   return new Person(personid, name, phone, amount);

  }

  return null;

 }

 

 public void delete(Integer id){  //删除方法
  SQLiteDatabase db = dbOpenHelper.getWritableDatabase();

  db.execSQL("delete from person where personid=?", new Object[]{id});

 }

 

 public List<Person> getScrollData(int offset, int maxResult){  //分页方法
  List<Person> persons = new ArrayList<Person>();

  SQLiteDatabase db = dbOpenHelper.getReadableDatabase();

  Cursor cursor = db.rawQuery("select * from person order by personid asc limit ?,?",

    new String[]{String.valueOf(offset), String.valueOf(maxResult)});

  while(cursor.moveToNext()){

   int personid = cursor.getInt(cursor.getColumnIndex("personid"));

   int amount = cursor.getInt(cursor.getColumnIndex("amount"));

   String name = cursor.getString(cursor.getColumnIndex("name"));

   String phone = cursor.getString(cursor.getColumnIndex("phone"));

   persons.add(new Person(personid, name, phone, amount));

  }

  cursor.close();

  return persons;

 }

 public long getCount(){  //获取别表数据总数
  SQLiteDatabase db = dbOpenHelper.getReadableDatabase();

  Cursor cursor = db.rawQuery("select count(*) from person", null);

  cursor.moveToFirst();

  return cursor.getLong(0);

 }

}

3.测试

public class PersonServiceTest extends AndroidTestCase {

 private static final String TAG = "PersonServiceTest";

 

 public void testCreateDB() throws Throwable{

  DBOpenHelper dbOpenHelper = new DBOpenHelper(getContext());

  dbOpenHelper.getWritableDatabase();// <包>/databases

 }

 

 public void testSave() throws Throwable{

  PersonService service = new PersonService(getContext());

  for(int i = 1 ; i < 20 ; i++){

   Person person = new Person("QQ"+ i, "136666666"+ i, 89);

   service.save(person);

  }

 }

 

 public void testFind() throws Throwable{

  PersonService service = new PersonService(getContext());

  Person person = service.find(1);

  Log.i(TAG, person.toString());

 }

 

 public void testUpdate() throws Throwable{

  PersonService service = new PersonService(getContext());

  Person person = service.find(1);

  person.setName("zhangxiaoxiao");

  service.update(person);

 }

 

 public void testCount() throws Throwable{

  PersonService service = new PersonService(getContext());

  Log.i(TAG, ""+service.getCount());

 }

 

 public void testScrollData() throws Throwable{

  PersonService service = new PersonService(getContext());

  List<Person> persons = service.getScrollData(0, 6);

  for(Person person : persons){

   Log.i(TAG, person.toString());

  }

 }

 

 public void testDelete() throws Throwable{

  PersonService service = new PersonService(getContext());

  service.delete(20);

 }

 

 public void testUpdateAmount() throws Throwable{

  PersonService service = new PersonService(getContext());

  service.payment();

 }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android sql rawQuery execSQL
相关文章推荐