我正在使用SQLiteDatabase的查询方法。我如何使用查询方法?
我试过了:
Cursor cursor = sqLiteDatabase.query(
tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);
tableColumns - columns参数构造如下。
String[] columns = new String[]{KEY_ID, KEY_CONTENT};
如果我们需要获取所有字段,应该如何构造column参数。我们是否需要在String数组中包含所有字段名称?
如何正确使用查询方法?
答案 0 :(得分:234)
TableColumn来
null
适用于SELECT * FROM ...
new String[] { "column1", "column2", ... }
针对SELECT column1, column2 FROM ...
中的特定列 - 您还可以在此处输入复杂的表达式:new String[] { "(SELECT max(column1) FROM table1) AS max" }
会为您提供一个名为max
的列,其最大值为column1
whereClause
WHERE
之后放置的没有该关键字的部分,例如"column1 > 5"
?
用于动态的内容,例如"column1=?"
- >见whereArgs
whereArgs
?
中每个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版本,您可以获得自动转义的值,并且您不必担心输入数据是否包含'
。
不安全:String whereClause = "column1='" + value + "'";
安全:String whereClause = "column1=?";
因为如果值包含'
,您的语句会中断并且您会获得异常或意外的事情,例如value = "XYZ'; DROP TABLE table1;--"
甚至可能会删除您的表,因为该语句将成为两个语句和注释:< / p>
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
使用args版本XYZ'; DROP TABLE table1;--
将转义为'XYZ''; DROP TABLE table1;--'
,并且只会被视为值。即使'
不打算做坏事,人们仍然很常见,或者在文本,文件名,密码等中使用它。所以总是使用args版本。 (可以将int
和其他原语直接构建到whereClause
但是)
答案 1 :(得分:16)
Where子句和args一起工作以形成SQL查询的WHERE语句。所以说你想表达
WHERE Column1 = 'value1' AND Column2 = 'value2'
然后你的whereClause和whereArgs将如下
String whereClause = "Column1 =? AND Column2 =?";
String[] whereArgs = new String[]{"value1", "value2"};
如果要选择所有表列,我相信传递给tableColumns的空字符串就足够了。
答案 2 :(得分:15)
这是一个更为通用的答案,旨在为未来的观众提供快速参考。
示例强>
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
字符串:要返回的列的列表。传递null将返回所有列,不鼓励阻止读取数据 来自不会被使用的存储。selection
字符串:一个过滤器,声明要返回哪些行,格式化为SQL WHERE子句(不包括WHERE本身)。通过 null将返回给定表的所有行。selectionArgs
字符串:您可以在选择中包含?,它将被来自selectionArgs的值替换,以便它们 出现在选择中。这些值将绑定为字符串。groupBy
字符串:声明如何对行进行分组的过滤器,格式为SQL GROUP BY子句(不包括GROUP BY本身)。传递null 将导致行不被分组。having
字符串:过滤器声明要在游标中包含哪些行组,如果正在使用行分组,则格式化为SQL HAVING 条款(不包括HAVING本身)。传递null将导致所有行 要包含的组,并且在不进行行分组时是必需的 使用。orderBy
字符串:如何对行进行排序,格式化为SQL ORDER BY子句(不包括ORDER BY本身)。传递null将使用 默认排序顺序,可能是无序的。limit
字符串:限制查询返回的行数,格式为LIMIT子句。传递null表示没有LIMIT子句。
答案 3 :(得分:0)
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/
答案 4 :(得分:0)
如果你的SQL查询是这样的
SELECT col-1, col-2 FROM tableName WHERE col-1=apple,col-2=mango
GROUPBY col-3 HAVING Count(col-4) > 5 ORDERBY col-2 DESC LIMIT 15;
然后对于query()方法,我们可以这样做: -
String table = "tableName";
String[] columns = {"col-1", "col-2"};
String selection = "col-1 =? AND col-2=?";
String[] selectionArgs = {"apple","mango"};
String groupBy =col-3;
String having =" COUNT(col-4) > 5";
String orderBy = "col-2 DESC";
String limit = "15";
query(tableName, columns, selection, selectionArgs, groupBy, having, orderBy, limit);