【转】SQLite中execSql、query、rawQuery的用法

Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。
对SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。

execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句
rawQuery()方法用于执行select语句。

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

1
2
3
SQLiteDatabase sqLiteDatabase = ....;
sqLiteDatabase .execSQL("insert into person(name, age) values(?,?)", new Object[]{"测试数据", 4});
sqLiteDatabase .close();

(2)rawQuery()方法的使用案例
rawQuery()方法的第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null。带占位符参数的select语句使用例子如下:

1
2
3
4
5
SQLiteDatabase sqLiteDatabase = ....;
Cursor cursor = sqLiteDatabase.rawQuery("select * from personwhere name like ?and age=?", new String[]{"%iteedu%", "4"});
//......
cursor.close();
sqLiteDatabase .close();

(3)query和rawQuery
下面两个分别是query和rawQuery的查询语句,主要区别是rawQuery是直接使用SQL语句进行查询的,也就是第一个参数字符串,在字符串内的“?”会被后面的String[]数组逐一对换掉;而query函数是Android自己封装的查询API。

1
2
Cursor cursor = db.rawQuery("select name from *** where id=?", new String[]{"1"});
Cursor cursor = db.query("***", new String[]{"name"}, "id=?", new String[]{"1"}, null, null, null);

query对比rawQuery的好处在于,当你用rawQuery在写入SQL语句的时候,有可能写错了或者写漏了什么单词拼写错误的时候,而query相对来讲出错的机率就比较小。这两者调的都是同一个方法 rawQueryWithFactory。

如果为了防止SQL注入,推荐使用query,由于query的参数一段段都是分开的。但是如果为了更好的跨平台推荐大家使用rawQuery原始SQL语句直接操作,在代码和处理效率上都有不小的提高,不过要做好SQL语句异常处理。