SQLiteDatabase.query方法

sre*_*dev 120 sqlite android

我正在使用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)

  • @ Lion789有几个版本都有`limit`参数,例如http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#query%28java.lang.String,%20java.lang. String [],%20java.lang.String,%20java.lang.String [],%20java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String%29它是所有这些都只是简单的文本连接,所以你可以将例如``some_column LIMIT 10``放入`orderBy`中它仍然可以工作 (3认同)
  • @VijayKumbhoje无论你感觉更舒服/最终看起来更干净.`query`方法只是在参数[(参见源代码)]中添加一些关键词如`SELECT`和`FROM`(https://github.com/android/platform_frameworks_base/blob/master/core/java/android /database/sqlite/SQLiteQueryBuilder.java#L201)然后使用生成的查询字符串执行`rawQuery`.如果你的查询不适合`query`的可用参数,那么就自己编写查询字符串. (3认同)
  • @VijayKumbhoje你应该可以把例如`table1 CROSS JOIN table2`作为tablename.但有一点我会看看rawquery:/sf/ask/741869621/ (2认同)

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的空字符串就足够了.