SQLiteDatabase.query方法

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

我试过这个:

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

tableColumns – columns参数的构造如下。

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

如果我们需要得到所有的字段,应该如何构造列参数。 我们是否需要在string数组中包含所有的字段名?

我如何正确使用查询方法?

TableColumn来

  • 对于所有列,如SELECT * FROM ...
  • new String[] { "column1", "column2", ... }为特定列在SELECT column1, column2 FROM ... – 你也可以把复杂的expression式在这里:
    new String[] { "(SELECT max(column1) FROM table1) AS max" }会给你一个名为max的列,保留column1的最大值

whereClause

  • 你放在WHERE之后没有那个关键字的部分,例如"column1 > 5"
  • 应该包括? 对于dynamic的东西,例如"column1=?" – >看whereArgs

whereArgs

  • 指定填充每个内容? 在他们出现的顺序在whereClause

其他

  • 就像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数据是否包含。

不安全: String whereClause = "column1='" + value + "'";
安全: String whereClause = "column1=?";

因为如果value包含'你的语句要么中断,你会得到exception或意想不到的事情,例如value = "XYZ'; DROP TABLE table1;--"甚至可能会删除你的表,因为语句将成为两个语句和一个注释:

 SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--' 

使用参数XYZ'; DROP TABLE table1;-- XYZ'; DROP TABLE table1;--将被转义为'XYZ''; DROP TABLE table1;--' 'XYZ''; DROP TABLE table1;--'只会被视为一个值。 即使'不打算做坏事”,人们仍然很常用,或者在文本,文件名,密码等中使用它,所以总是使用args版本。 (可以将int和其他原语直接构build到whereClause

where子句和args一起构成SQL查询的WHERE语句。 所以说你想expression

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

那么你的whereClause和whereArgs将如下所示

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

如果你想select所有的表列,我相信一个空string传递给tableColumns就足够了。

这是一个更普遍的答案,意味着为未来的观众提供一个快速参考。

 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); 

来自文档的说明

  • tablestring:用于编译查询的表名。
  • columnsstring:要返回的列的列表。 传递null将返回所有的列,这是不鼓励的,以防止从将不被使用的存储读取数据。
  • selectionstring:声明要返回哪些行的filter,格式化为SQL WHERE子句(不包括WHERE本身)。 传递null将返回给定表的所有行。
  • selectionArgsstring:您可以在selection中包含?s,它将被selectionArgs中的值replace,以便它们出现在select中。 这些值将被绑定为string。
  • groupBy String:filter,声明如何对行进行分组,格式化为SQL GROUP BY子句(不包括GROUP BY本身)。 传递null将导致行不被分组。
  • havingstring:filter声明哪些行组包含在游标中,如果正在使用行分组,则格式化为SQL HAVING子句(不包括HAVING本身)。 传递null将导致包含所有行组,并且在不使用行分组时是必需的。
  • orderBy String:如何对行进行sorting,格式为SQL ORDER BY子句(不包括ORDER BY本身)。 传递null将使用默认的sorting顺序,可能是无序的。
  • limit String:限制查询返回的行数,格式为LIMIT子句。 传递null表示没有LIMIT子句。
  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/