表列
null
对于所有列,如SELECT * FROM ...
new String[] { "column1", "column2", ... }
对于特定列,如SELECT column1, column2 FROM ...
- 您也可以在此处放置复杂的表达式:
new String[] { "(SELECT max(column1) FROM table1) AS max" }
会给您一个名为的列max
,其中包含column1
where子句
- 您在
WHERE
没有该关键字的情况下放置的部分,例如"column1 > 5"
- 应该包括
?
动态的东西,例如"column1=?"
-> 见whereArgs
哪里Args
?
指定按照它们出现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-data 是否包含'
.
不安全:String whereClause = "column1='" + value + "'";
安全:String whereClause = "column1=?";
因为如果 value 包含'
您的语句,则您的语句会中断并且您会遇到异常或执行意外操作,例如,value = "XYZ'; DROP TABLE table1;--"
甚至可能会删除您的表,因为该语句将成为两个语句和一个注释:
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
使用 args 版本XYZ'; DROP TABLE table1;--
将被转义'XYZ''; DROP TABLE table1;--'
并仅被视为一个值。即使'
不打算做坏事,人们在他们的名字中使用它或在文本、文件名、密码等中使用它仍然很常见。所以总是使用 args 版本。(虽然可以直接构建int
和其他原语whereClause
)