126

我正在使用 SQLiteDatabase 的查询方法。如何使用查询方法?

我试过这个:

Cursor cursor = sqLiteDatabase.query(
    tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);

tableColumns - columns 参数构造如下。

String[] columns = new String[]{KEY_ID, KEY_CONTENT};

如果我们需要获取所有的字段,列参数应该如何构造。我们是否需要在字符串数组中包含所有字段名称?

如何正确使用查询方法?

4

5 回答 5

251

表列

  • 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

于 2012-05-15T13:28:42.153 回答
23

这是一个更一般的答案,旨在为未来的观众提供快速参考。

例子

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 字符串:用于编译查询的表名。
  • columns 字符串:要返回的列的列表。传递 null 将返回所有列,不鼓励这样做以防止从存储中读取不会使用的数据。
  • selection 字符串:声明要返回哪些行的过滤器,格式化为 SQL WHERE 子句(不包括 WHERE 本身)。传递 null 将返回给定表的所有行。
  • selectionArgs 字符串:您可以在选择中包含 ?s,它将被 selectionArgs 中的值替换,以便它们出现在选择中。这些值将绑定为字符串。
  • groupBy 字符串:声明如何对行进行分组的过滤器,格式化为 SQL GROUP BY 子句(不包括 GROUP BY 本身)。传递 null 将导致行不被分组。
  • having 字符串:一个过滤器声明要在游标中包含哪些行组,如果正在使用行分组,则格式化为 SQL HAVING 子句(不包括 HAVING 本身)。传递 null 将导致包含所有行组,并且在不使用行分组时是必需的。
  • orderBy 字符串:如何对行进行排序,格式为 SQL ORDER BY 子句(不包括 ORDER BY 本身)。传递 null 将使用默认排序顺序,可能是无序的。
  • limit 字符串:限制查询返回的行数,格式为 LIMIT 子句。传递 null 表示没有 LIMIT 子句。
于 2016-10-24T05:02:08.310 回答
19

Where 子句和 args 共同构成 SQL 查询的 WHERE 语句。所以说你想表达

WHERE Column1 = 'value1' AND Column2 = 'value2'

那么你的 whereClause 和 whereArgs 将如下

String whereClause = "Column1 =? AND Column2 =?";
String[] whereArgs = new String[]{"value1", "value2"};

如果要选择所有表列,我相信传递给 tableColumns 的空字符串就足够了。

于 2012-05-15T12:47:50.750 回答
4

如果你的 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);
于 2018-03-09T07:10:50.193 回答
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, 这里=where子句。要选择所有值,您必须提供所有列名:

or you can use a raw query like this 
db.rawQuery("SELECT * FROM permissions_table WHERE name = 'Comics' ", null);

这是一个很好的数据库教程

于 2012-05-15T12:57:31.200 回答