我正在使用SQLiteDatabase的查询方法.我如何使用查询方法?
我试过这个:
Cursor cursor = sqLiteDatabase.query(
tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);
Run Code Online (Sandbox Code Playgroud)
tableColumns - columns参数构造如下.
String[] columns = new String[]{KEY_ID, KEY_CONTENT};
Run Code Online (Sandbox Code Playgroud)
如果我们需要获取所有字段,那么应该如何构造column参数.我们是否需要在String数组中包含所有字段名称?
如何正确使用查询方法?
zap*_*apl 238
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");
Run Code Online (Sandbox Code Playgroud)
等效于以下原始查询
String queryString =
"SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
"WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);
Run Code Online (Sandbox Code Playgroud)
通过使用Where/Bind -Args版本,您可以获得自动转义的值,并且您不必担心输入数据是否包含'
.
不安全:String whereClause = "column1='" + value + "'";
安全:String whereClause = "column1=?";
因为如果value包含'
你的语句要么中断你得到异常,要么做出意想不到的事情,例如value = "XYZ'; DROP TABLE table1;--"
甚至可能会删除你的表,因为该语句将成为两个语句和一个注释:
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
Run Code Online (Sandbox Code Playgroud)
使用args版本XYZ'; DROP TABLE table1;--
将被转义为'XYZ''; DROP TABLE table1;--'
,并且只会被视为一个值.即使'
不打算做坏事,人们仍然很常见,或者在文本,文件名,密码等中使用它.所以总是使用args版本.(可以int
直接构建和其他原语whereClause
)
Sur*_*gch 18
这是一个更通用的答案,旨在成为未来观众的快速参考.
例
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);
Run Code Online (Sandbox Code Playgroud)
从说明文档
table
String:要编译查询的表名.columns
String:要返回的列的列表.传递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子句.
Anc*_*tus 16
Where子句和args一起工作以形成SQL查询的WHERE语句.所以说你想表达
WHERE Column1 = 'value1' AND Column2 = 'value2'
Run Code Online (Sandbox Code Playgroud)
然后你的whereClause和whereArgs将如下
String whereClause = "Column1 =? AND Column2 =?";
String[] whereArgs = new String[]{"value1", "value2"};
Run Code Online (Sandbox Code Playgroud)
如果要选择所有表列,我相信传递给tableColumns的空字符串就足够了.
归档时间: |
|
查看次数: |
183750 次 |
最近记录: |