2

すべての質問を検索しましたが、まだ答えが見つかりません。私が最も近づいたのは、このFMDB を介して sqlite WHERE IN 句に配列を渡すことでしたか? . しかし、提案された答えはうまくいかなかったようです。このコマンドはエラーをスローしませんが、意図した操作 (DELETE など) も実行しません。これが私がやろうとしていることです:

[myDB executeUpdateWithFormat:@"DELETE FROM table WHERE row_id IN (%@)",rowIdsToBeDeleted];

rowIdsToBeDeleted は、rowIds を NSNumber オブジェクトとして含むコンマ区切りの NSString です。

1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012

executeUpdate を使用してみましたが、うまくいきませんでした。どなたか助けていただけませんか?

4

2 に答える 2

4

あなたは簡単に行うことができます:

[myDB executeUpdate:[NSString stringWithFormat:@"DELETE FROM table WHERE row_id IN (%@)",rowIdsToBeDeleted]];

メソッド名から推測できる内容にもかかわらず、このexecuteUpdateWithFormatメソッドは従来のスタイルの書式設定を実行しません。printf舞台裏で実際に行っているのは、フォーマット文字列を反復処理し、printf スタイルの文字列を?プレースホルダーに置き換えてから、適切な関数を試してsqlite3_bind_xxx値をそれらのプレースホルダーにバインドします。

のこの実装は、executeUpdateWithFormatあらゆる種類の微妙な問題をもたらします。(このため、将来の FMDB バージョンでは非推奨になる可能性があります。) この特定のケースでは、単一のプレースホルダーsqlite3_bind_xxxにバインドされる値の配列としてコンマ区切りの文字列をバインドできないという問題があります。?

一般stringWithFormatに、FMDB または SQLite に渡される SQL ステートメントを作成するために (または Swift 文字列補間) を使用することは避けるべきです。これは、不適切に行うと、SQL インジェクション攻撃にさらされたり、文字列値を適切にエスケープできなかった場合に失敗したりする可能性があるためです。ただし、数値が一連の数値の範囲内にあるかどうかをテストするこの例は、その規則の例外であり、stringWithFormat上記のように使用できます。

于 2012-07-17T17:08:54.223 に答える
-2

そのメソッドが NSPredicate 構文のようなものである場合は、括弧を削除するだけです (括弧は自動的に処理されます (文字列の代わりにコレクションを渡します))。

NSArray *ids = [rowIdsToBeDeleted componentsSeparatedByString:@","];
[myDB executeUpdateWithFormat:@"DELETE FROM table WHERE row_id IN %@",ids];

編集

また、通常、実際のコレクション オブジェクト (文字列ではありません) を渡します...上記は反映するように編集されています

于 2012-07-17T17:07:52.730 に答える