SQLiteDatabase のクエリ メソッドを使用しています。クエリ メソッドはどのように使用すればよいですか?
私はこれを試しました:
Cursor cursor = sqLiteDatabase.query(
tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);
テーブル列- columns パラメータは次のように構成されます。
String[] columns = new String[]{KEY_ID, KEY_CONTENT};
すべてのフィールドを取得する必要がある場合、列パラメータをどのように構築する必要がありますか。すべてのフィールド名を文字列配列に含める必要がありますか?
クエリメソッドを適切に使用するにはどうすればよいですか?
ベストアンサー1
テーブル列
null
すべての列についてSELECT * FROM ...
new String[] { "column1", "column2", ... }
特定の列の場合SELECT column1, column2 FROM ...
、次のように複雑な式を入力することもできます。最大値を保持する
new String[] { "(SELECT max(column1) FROM table1) AS max" }
列名が与えられます。max
column1
where句
WHERE
そのキーワードを除いた後に置く部分、例:"column1 > 5"
?
動的なものについては以下を含める必要があります。例:"column1=?"
->参照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;--"
。たとえば、ステートメントが 2 つのステートメントとコメントになるため、テーブルが削除される可能性もあります。
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
args バージョンを使用すると、XYZ'; DROP TABLE table1;--
は にエスケープされ'XYZ''; DROP TABLE table1;--'
、値としてのみ扱われます。 が'
悪意を持っていない場合でも、名前に を含めたり、テキスト、ファイル名、パスワードなどで使用したりすることはよくあります。したがって、常に args バージョンを使用してください。 (ただしint
、 やその他のプリミティブを直接組み込むことは問題ありませんwhereClause
)