[解決済み] IN句とプレースホルダー
2022-12-02 16:59:41
質問
Androidで以下のようなSQLクエリを実行しようとしています。
String names = "'name1', 'name2"; // in the code this is dynamically generated
String query = "SELECT * FROM table WHERE name IN (?)";
Cursor cursor = mDb.rawQuery(query, new String[]{names});
しかし、Androidはクエスチョンマークを正しい値に置き換えてはくれません。 以下のようにすることもできますが、これではSQLインジェクションを防ぐことはできません。
String query = "SELECT * FROM table WHERE name IN (" + names + ")";
Cursor cursor = mDb.rawQuery(query, null);
この問題を回避し、IN句を使用できるようにするにはどうしたらよいでしょうか。
どのように解決するのですか?
のような形式の文字列
"?, ?, ..., ?"
は動的に作成された文字列で、元のSQLクエリに安全に入れることができ(外部データを含まない制限されたフォームであるため)、その後プレースホルダーを通常通り使用することができます。
関数を考えてみましょう。
String makePlaceholders(int len)
を返す
len
のようにカンマで区切られたクエスチョンマークを返します。
String[] names = { "name1", "name2" }; // do whatever is needed first
String query = "SELECT * FROM table"
+ " WHERE name IN (" + makePlaceholders(names.length) + ")";
Cursor cursor = mDb.rawQuery(query, names);
ちょうど場所と同じ数の値を渡すことを確認してください。デフォルトの最大値は ホストパラメータの上限 は999です - 少なくとも通常のビルドでは。)
ここに一つの実装があります。
String makePlaceholders(int len) {
if (len < 1) {
// It will lead to an invalid query anyway ..
throw new RuntimeException("No placeholders");
} else {
StringBuilder sb = new StringBuilder(len * 2 - 1);
sb.append("?");
for (int i = 1; i < len; i++) {
sb.append(",?");
}
return sb.toString();
}
}
関連
-
[解決済み] Androidのgravityとlayout_gravityの違いは何ですか?
-
[解決済み] TextViewでテキストを水平・垂直方向にセンタリングするには?
-
[解決済み] match_parentとfill_parentの違いは何ですか?
-
[解決済み】「px」、「dip」、「dp」、「sp」の違いは?
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] AndroidにおけるViewPager2の適切な実装
-
[解決済み] Android Studioの「未実装メソッドの追加」機能
-
[解決済み] onCreate(Bundle savedInstanceState)とは?
-
[解決済み] 通知をクリックした後にアプリケーションを開く
-
[解決済み] Travis.yml ./gradlew : パーミッションが拒否されました。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Android Webview - キャッシュを完全に削除する
-
[解決済み] プログラム的に電話をかけるには?
-
[解決済み] Android ConstraintLayout - あるビューを別のビューの上に配置する
-
[解決済み] これはどういうことですか?失敗 [INSTALL_FAILED_CONTAINER_ERROR]?
-
[解決済み] onCreate(Bundle savedInstanceState)とは?
-
[解決済み] ArrayList<MyCustomClass>をJSONArrayに変換する。
-
[解決済み] TextView.setTextSizeの挙動がおかしい - テキストビューのテキストサイズを画面ごとに動的に設定する方法
-
[解決済み] Androidの環境設定。ユーザーが環境設定画面を使用していない場合、デフォルト値を読み込むにはどうすればよいですか?
-
[解決済み] WhatsAppでメッセージを送信する
-
[解決済み] HttpURLConnectionを使ったPOSTによるファイル送信