tableColumns
nullのようにすべての列に対してSELECT * FROM ...
new String[] { "column1", "column2", ... }次のような特定の列のSELECT column1, column2 FROM ...場合-ここに複雑な式を配置することもできます:の最大値を保持する
new String[] { "(SELECT max(column1) FROM table1) AS max" }という名前の列が得られますmaxcolumn1
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も問題ありません)