tableColumns
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バージョンを使用すると、自動的にエスケープされた値が取得され、input-dataにが含まれているかどうかを心配する必要はありません'
。
安全ではない:String whereClause = "column1='" + value + "'";
安全:String whereClause = "column1=?";
値にステートメントが含まれている場合'
、ステートメントが壊れて例外が発生するか、意図しないことを行うため、たとえばvalue = "XYZ'; DROP TABLE table1;--"
、ステートメントが2つのステートメントとコメントになるため、テーブルが削除される可能性があります。
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
argsバージョンを使用するXYZ'; DROP TABLE table1;--
と、エスケープ'XYZ''; DROP TABLE table1;--'
され、値としてのみ扱われます。'
が悪いことをすることを意図していない場合でも、人々が名前にそれを持っているか、テキスト、ファイル名、パスワードなどでそれを使用することは非常に一般的です。したがって、常にargsバージョンを使用してください。int
(ただし、他のプリミティブを直接ビルドしてwhereClause
も問題ありません)