SQLiteDatabase.query方法

时间:2012-05-15 12:29:24

标签: android sqlite

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

我试过了:

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

tableColumns - columns参数构造如下。

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

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

如何正确使用查询方法?

5 个答案:

答案 0 :(得分:234)

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

等同于以下原始查询

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版本,您可以获得自动转义的值,并且您不必担心输入数据是否包含'

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

因为如果值包含',您的语句会中断并且您会获得异常或意外的事情,例如value = "XYZ'; DROP TABLE table1;--"甚至可能会删除您的表,因为该语句将成为两个语句和注释:< / p>

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

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

答案 1 :(得分:16)

Where子句和args一起工作以形成SQL查询的WHERE语句。所以说你想表达

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

然后你的whereClause和whereArgs将如下

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

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

答案 2 :(得分:15)

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

示例

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

来自documentation

的说明
  
      
  • table String:用于编译查询的表名。
  •   
  • columns字符串:要返回的列的列表。传递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子句。
  •   

答案 3 :(得分: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, 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/

答案 4 :(得分:0)

如果你的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);