web-dev-qa-db-ja.com

SQLiteDatabase.queryメソッド

SQLiteDatabaseのクエリメソッドを使用しています。クエリメソッドの使用方法

私はこれを試しました:

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

tableColumns-columnsパラメーターは次のように構築されます。

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

すべてのフィールドを取得する必要がある場合、列パラメーターをどのように構築する必要があります。すべてのフィールド名を文字列配列に含める必要がありますか?

クエリメソッドを適切に使用するにはどうすればよいですか?

117
sree_iphonedev

tableColumns

  • SELECT * FROM ...のように、すべての列に対してnull
  • new String[] { "column1", "column2", ... }のように特定の列のSELECT column1, column2 FROM ...-複雑な式をここに置くこともできます:
    new String[] { "(SELECT max(column1) FROM table1) AS max" }は、column1の最大値を保持するmaxという名前の列を提供します

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バージョンを使用すると、自動的にエスケープされた値が取得されるため、input-dataに'が含まれているかどうかを心配する必要はありません。

安全でない:String whereClause = "column1='" + value + "'";
安全:String whereClause = "column1=?";

値に'が含まれている場合、ステートメントが壊れて例外が発生するか、意図しないことを行うため、たとえば、ステートメントが2つのステートメントとコメントになるため、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に直接ビルドしてもかまいません)

235
zapl

Where句と引数が連携して、SQLクエリのWHEREステートメントを形成します。だからあなたが表現しようとしていると言う

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

その後、whereClauseとwhereArgsは次のようになります

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

すべてのテーブル列を選択したい場合は、tableColumnsに渡されたnull文字列で十分だと思います。

16
Ancantus

これは、将来の視聴者向けのクイックリファレンスとなることを目的とした、より一般的な回答です。

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文字列:返される行を宣言するフィルター。SQLWHERE句としてフォーマットされます(WHERE自体を除く)。 nullを渡すと、指定されたテーブルのすべての行が返されます。
  • selectionArgs文字列:選択に?sを含めることができます。これは、selectionArgsの値に置き換えられ、選択に表示されます。値は文字列としてバインドされます。
  • groupBy文字列:行をグループ化する方法を宣言するフィルター。SQLGROUP BY句としてフォーマットされます(GROUP BY自体を除く)。 nullを渡すと、行はグループ化されません。
  • having文字列:フィルターは、SQL HAVING句(HAVING自体を除く)としてフォーマットされた行グループ化が使用されている場合、カーソルに含める行グループを宣言します。 nullを渡すと、すべての行グループが含まれます。これは、行グループ化が使用されていない場合に必要です。
  • orderBy文字列:SQL ORDER BY句としてフォーマットされた行の順序付け方法(ORDER BY自体を除く)。 nullを渡すと、デフォルトの並べ替え順序が使用されます。
  • limit文字列:クエリによって返される行の数を制限し、LIMIT句としてフォーマットされます。 nullを渡すと、LIMIT句がないことを示します。
16
Suragch

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);
1
Puneet Verma
 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/

0
Avi Kumar Manku