SQLiteDatabase.query メソッド 質問する

SQLiteDatabase.query メソッド 質問する

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" }列名が与えられます。maxcolumn1

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)

おすすめ記事