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=?";
値にa '
ステートメントが含まれている場合、ステートメントが壊れて例外が発生するか、意図しないことを行うと、たとえば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
も問題ありません)