SQLiteDatabaseのクエリメソッドを使用しています。クエリメソッドの使用方法
私はこれを試しました:
Cursor cursor = sqLiteDatabase.query(
tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);
tableColumns-columnsパラメーターは次のように構築されます。
String[] columns = new String[]{KEY_ID, KEY_CONTENT};
すべてのフィールドを取得する必要がある場合、列パラメーターをどのように構築する必要があります。すべてのフィールド名を文字列配列に含める必要がありますか?
クエリメソッドを適切に使用するにはどうすればよいですか?
tableColumns
SELECT * FROM ...
のように、すべての列に対してnull
new String[] { "column1", "column2", ... }
のように特定の列のSELECT column1, column2 FROM ...
-複雑な式をここに置くこともできます:new String[] { "(SELECT max(column1) FROM table1) AS max" }
は、column1
の最大値を保持するmax
という名前の列を提供します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=?";
値に'
が含まれている場合、ステートメントが壊れて例外が発生するか、意図しないことを行うため、たとえば、ステートメントが2つのステートメントとコメントになるため、value = "XYZ'; DROP TABLE table1;--"
がテーブルを削除することもあります。
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
argsバージョンXYZ'; DROP TABLE table1;--
を使用すると、'XYZ''; DROP TABLE table1;--'
にエスケープされ、値としてのみ処理されます。 '
が悪いことをすることを意図していない場合でも、人々が名前に使用したり、テキスト、ファイル名、パスワードなどで使用したりすることは非常に一般的です。常にargsバージョンを使用してください。 (int
および他のプリミティブをwhereClause
に直接ビルドしてもかまいません)
Where句と引数が連携して、SQLクエリのWHEREステートメントを形成します。だからあなたが表現しようとしていると言う
WHERE Column1 = 'value1' AND Column2 = 'value2'
その後、whereClauseとwhereArgsは次のようになります
String whereClause = "Column1 =? AND Column2 =?";
String[] whereArgs = new String[]{"value1", "value2"};
すべてのテーブル列を選択したい場合は、tableColumnsに渡されたnull文字列で十分だと思います。
これは、将来の視聴者向けのクイックリファレンスとなることを目的とした、より一般的な回答です。
例
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
文字列:返される行を宣言するフィルター。SQLWHERE句としてフォーマットされます(WHERE自体を除く)。 nullを渡すと、指定されたテーブルのすべての行が返されます。selectionArgs
文字列:選択に?sを含めることができます。これは、selectionArgsの値に置き換えられ、選択に表示されます。値は文字列としてバインドされます。groupBy
文字列:行をグループ化する方法を宣言するフィルター。SQLGROUP BY句としてフォーマットされます(GROUP BY自体を除く)。 nullを渡すと、行はグループ化されません。having
文字列:フィルターは、SQL HAVING句(HAVING自体を除く)としてフォーマットされた行グループ化が使用されている場合、カーソルに含める行グループを宣言します。 nullを渡すと、すべての行グループが含まれます。これは、行グループ化が使用されていない場合に必要です。orderBy
文字列:SQL ORDER BY句としてフォーマットされた行の順序付け方法(ORDER BY自体を除く)。 nullを渡すと、デフォルトの並べ替え順序が使用されます。limit
文字列:クエリによって返される行の数を制限し、LIMIT句としてフォーマットされます。 nullを渡すと、LIMIT句がないことを示します。
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);
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, here "=" is the where clause
to select all values you will have to give all column names
or you can use a raw query like this
db.rawQuery("SELECT * FROM permissions_table WHERE name = 'Comics' ", null);
そして、これはデータベースのための良いチュートリアルです
http://www.anotherandroidblog.com/2010/08/04/Android-database-tutorial/