126

SQLiteDatabaseのクエリメソッドを使用しています。クエリメソッドを使用するにはどうすればよいですか?

私はこれを試しました:

Cursor cursor = sqLiteDatabase.query(
    tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);

tableColumns -columnsパラメーターは次のように構成されます。

String[] columns = new String[]{KEY_ID, KEY_CONTENT};

すべてのフィールドを取得する必要がある場合、列パラメーターをどのように作成する必要がありますか。文字列配列にすべてのフィールド名を含める必要がありますか?

クエリメソッドを適切に使用するにはどうすればよいですか?

4

5 に答える 5

251

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も問題ありません)

于 2012-05-15T13:28:42.153 に答える
19

Where 句と引数が連携して、SQL クエリの WHERE ステートメントを形成します。だから、あなたが表現しようとしていると言います

WHERE Column1 = 'value1' AND Column2 = 'value2'

次に、whereClause と whereArgs は次のようになります

String whereClause = "Column1 =? AND Column2 =?";
String[] whereArgs = new String[]{"value1", "value2"};

すべてのテーブル列を選択したい場合は、tableColumns に渡された null 文字列で十分だと思います。

于 2012-05-15T12:47:50.750 に答える
0
db.query(
        TABLE_NAME,
        new String[] { TABLE_ROW_ID, TABLE_ROW_ONE, TABLE_ROW_TWO },
        TABLE_ROW_ID + "=" + rowID,
        null, null, null, null, null
);

TABLE_ROW_ID + "=" + rowID、ここ=where節があります。すべての値を選択するには、すべての列名を指定する必要があります。

or you can use a raw query like this 
db.rawQuery("SELECT * FROM permissions_table WHERE name = 'Comics' ", null);

ここにデータベースの優れたチュートリアルがあります。

于 2012-05-15T12:57:31.200 に答える