SQLiteDatabase.queryメソッド


121

SQLiteDatabaseのqueryメソッドを使用しています。クエリメソッドの使用方法

私はこれを試しました:

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

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

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

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

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



私はその方法を知っています。しかし、私はrawQueryの代わりにクエリメソッドを実装する方法を学習しようとしています。
sree_iphonedev

回答:


244

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=?";

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


Limit / offsetはこれのどこに分類されますか?group by?持っている?オーダーバイ?
Lion789 14年

3
@ Lion789 limitパラメータのあるバージョンがいくつかあります。たとえば、developer.android.com / reference / android / database / sqlite /…結局のところ、すべて単純なテキスト連結なので、たとえばに"some_column LIMIT 10"挿入orderByしても機能します
zapl

ここで2つのテーブルを結合するオプションはありますか?
Vijay Kumbhoje 2017

2
@VijayKumbhojeあなたは例えばtable1 CROSS JOIN table2テーブル名として置くことができるはずです。:しかし、私はrawqueryを見てしまう点がありstackoverflow.com/q/10598137/995891
zapl

3
@VijayKumbhojeあなたがより快適に感じるものは何でも/最後にきれいに見えます。query方法は、単にのようないくつかのキーワードを追加するSELECTと、FROM引数に(ソースを参照)、次に行うrawQuery結果のクエリ文字列で。クエリがの使用可能な引数にうまく適合しない場合queryは、クエリ文字列を自分で記述してください。
zapl 2017

21

これは、将来の視聴者のためのクイックリファレンスとなることを意図した、より一般的な回答です。

SQLiteDatabase db = helper.getReadableDatabase();

String table = "table2";
String[] columns = {"column1", "column3"};
String selection = "column3 =?";
String[] selectionArgs = {"apple"};
String groupBy = null;
String having = null;
String orderBy = "column3 DESC";
String limit = "10";

Cursor cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);

ドキュメントからの説明

  • table 文字列:クエリをコンパイルする対象のテーブル名。
  • columns 文字列:返す列のリスト。nullを渡すと、すべての列が返されます。これは、使用されないストレージからのデータの読み取りを防ぐためにお勧めしません。
  • selection 文字列:SQL WHERE句としてフォーマットされた、返す行を宣言するフィルター(WHERE自体を除く)。nullを渡すと、指定されたテーブルのすべての行が返されます。
  • selectionArgs 文字列:?sを選択に含めることができます。選択に表示されるように、selectionArgsの値に置き換えられます。値は文字列としてバインドされます。
  • groupBy 文字列:SQL GROUP BY句としてフォーマットされた行のグループ化方法を宣言するフィルター(GROUP BY自体を除く)。nullを渡すと、行がグループ化されなくなります。
  • having 文字列:フィルターは、カーソルに含める行グループを宣言します。行グループが使用されている場合、SQL HAVING句(HAVING自体を除く)としてフォーマットされます。nullを渡すと、すべての行グループが含まれます。これは、行グループ化が使用されていない場合に必要です。
  • orderBy 文字列:SQL ORDER BY句としてフォーマットされた行の順序付け方法(ORDER BY自体を除く)。nullを渡すと、デフォルトの並べ替え順序が使用されます。
  • limit 文字列:クエリによって返される行数を制限します。LIMIT句としてフォーマットされます。nullを渡すと、LIMIT句がないことを示します。

16

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

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

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

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

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


同封していない?''必要に応じて自動的に追加された
zapl

1

あなたのSQLクエリがこのようなものなら

SELECT col-1, col-2 FROM tableName WHERE col-1=apple,col-2=mango
GROUPBY col-3 HAVING Count(col-4) > 5  ORDERBY col-2 DESC LIMIT 15;

次に、query()メソッドの場合、次のようにします。

String table = "tableName";
String[] columns = {"col-1", "col-2"};
String selection = "col-1 =? AND col-2=?";       
String[] selectionArgs = {"apple","mango"};
String groupBy =col-3;
String having =" COUNT(col-4) > 5";
String orderBy = "col-2 DESC";
String limit = "15";

query(tableName, columns, selection, selectionArgs, groupBy, having, orderBy, limit);

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);

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.