SQLiteDatabase.query方法
我正在使用SQLiteDatabase的查询方法。 我如何使用查询方法?
我试过这个:
Cursor cursor = sqLiteDatabase.query( tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);
tableColumns – columns参数的构造如下。
String[] columns = new String[]{KEY_ID, KEY_CONTENT};
如果我们需要得到所有的字段,应该如何构造列参数。 我们是否需要在string数组中包含所有的字段名?
我如何正确使用查询方法?
TableColumn来
- 对于所有列,如
SELECT * FROM ...
-
new String[] { "column1", "column2", ... }
为特定列在SELECT column1, column2 FROM ...
– 你也可以把复杂的expression式在这里:
new String[] { "(SELECT max(column1) FROM table1) AS max" }
会给你一个名为max
的列,保留column1
的最大值
whereClause
- 你放在
WHERE
之后没有那个关键字的部分,例如"column1 > 5"
- 应该包括
?
对于dynamic的东西,例如"column1=?"
– >看whereArgs
whereArgs
- 指定填充每个内容
?
在他们出现的顺序在whereClause
其他
- 就像
whereClause
关键字whereClause
的语句,如果不使用它,则返回null
。
例
String[] tableColumns = new String[] { "column1", "(SELECT max(column1) FROM table2) AS max" }; String whereClause = "column1 = ? OR column1 = ?"; String[] whereArgs = new String[] { "value1", "value2" }; String orderBy = "column1"; Cursor c = sqLiteDatabase.query("table1", tableColumns, whereClause, whereArgs, null, null, orderBy); // since we have a named column we can do int idx = c.getColumnIndex("max");
相当于下面的原始查询
String queryString = "SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " + "WHERE column1 = ? OR column1 = ? ORDER BY column1"; sqLiteDatabase.rawQuery(queryString, whereArgs);
通过使用Where / Bind -Args版本,您将自动获得转义值,而且您不必担心input数据是否包含。
不安全: String whereClause = "column1='" + value + "'";
安全: String whereClause = "column1=?";
因为如果value包含'
你的语句要么中断,你会得到exception或意想不到的事情,例如value = "XYZ'; DROP TABLE table1;--"
甚至可能会删除你的表,因为语句将成为两个语句和一个注释:
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
使用参数XYZ'; DROP TABLE table1;--
XYZ'; DROP TABLE table1;--
将被转义为'XYZ''; DROP TABLE table1;--'
'XYZ''; DROP TABLE table1;--'
只会被视为一个值。 即使'
不打算做坏事”,人们仍然很常用,或者在文本,文件名,密码等中使用它,所以总是使用args版本。 (可以将int
和其他原语直接构build到whereClause
)
where子句和args一起构成SQL查询的WHERE语句。 所以说你想expression
WHERE Column1 = 'value1' AND Column2 = 'value2'
那么你的whereClause和whereArgs将如下所示
String whereClause = "Column1 =? AND Column2 =?"; String[] whereArgs = new String[]{"value1", "value2"};
如果你想select所有的表列,我相信一个空string传递给tableColumns就足够了。
这是一个更普遍的答案,意味着为未来的观众提供一个快速参考。
例
SQLiteDatabase db = helper.getReadableDatabase(); String table = "table2"; String[] columns = {"column1", "column3"}; String selection = "column3 =?"; String[] selectionArgs = {"apple"}; String groupBy = null; String having = null; String orderBy = "column3 DESC"; String limit = "10"; Cursor cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);
来自文档的说明
table
string:用于编译查询的表名。columns
string:要返回的列的列表。 传递null将返回所有的列,这是不鼓励的,以防止从将不被使用的存储读取数据。selection
string:声明要返回哪些行的filter,格式化为SQL WHERE子句(不包括WHERE本身)。 传递null将返回给定表的所有行。selectionArgs
string:您可以在selection中包含?s,它将被selectionArgs中的值replace,以便它们出现在select中。 这些值将被绑定为string。groupBy
String:filter,声明如何对行进行分组,格式化为SQL GROUP BY子句(不包括GROUP BY本身)。 传递null将导致行不被分组。having
string:filter声明哪些行组包含在游标中,如果正在使用行分组,则格式化为SQL HAVING子句(不包括HAVING本身)。 传递null将导致包含所有行组,并且在不使用行分组时是必需的。orderBy
String:如何对行进行sorting,格式为SQL ORDER BY子句(不包括ORDER BY本身)。 传递null将使用默认的sorting顺序,可能是无序的。limit
String:限制查询返回的行数,格式为LIMIT子句。 传递null表示没有LIMIT子句。
db.query ( TABLE_NAME, new String[] { TABLE_ROW_ID, TABLE_ROW_ONE, TABLE_ROW_TWO }, TABLE_ROW_ID + "=" + rowID, null, null, null, null, null ); TABLE_ROW_ID + "=" + rowID, here "=" is the where clause to select all values you will have to give all column names or you can use a raw query like this db.rawQuery("SELECT * FROM permissions_table WHERE name = 'Comics' ", null);
这里是一个很好的数据库教程
http://www.anotherandroidblog.com/2010/08/04/android-database-tutorial/