0

XML をダウンロードし、その値を SQLite3 データベースに挿入するアプリを作成しています。があるたびにエラーが発生していた'ので、文字列をエスケープするために次の関数を作成しました。

+(NSString *)escapeString:(NSString *)string {
  NSRange range = NSMakeRange(0, [string length]); 
  NSMutableString *str =
    [NSMutableString stringWithString:string];  
  [str replaceOccurrencesOfString:@"'" withString:@"\\\'" options:0 range:range];
  return str; 
}

問題は、データベースがエラーを出していることunrecognized token: "\"です。私は何を間違っていますか?ところで、私はまだ Tiger を使用していますが、古いバージョンの SQLite を使用していることに関連している可能性はありますか? はいの場合、どうすれば解決できますか? 私が作成しているアプリは、Tiger でもできれば Panther でも動作する必要があることに注意してください。

4

1 に答える 1

1

SQL はスラッシュ文字でエスケープしません。'文字列内でエスケープするために単一引用符を使用します。

INSERT INTO xyz VALUES('5 O''clock');

参照

したがって、次の行を想定しています (使用している言語はわかりません)。

[str replaceOccurrencesOfString:@"'" withString:@"\\\'" options:0 range:range];

実際には次のようにする必要があります。

[str replaceOccurrencesOfString:@"'" withString:@"''" options:0 range:range];

コンテンツを自分でスクラブすることは、ベスト プラクティスに反します。sqlite のバインド機能を使用することをお勧めします。

自分で文字列操作を行う代わりに:

sql = "INSERT INTO xyz VALUES('"+ my_value +"');"

次のようなものを使用します。

sql = "INSERT INTO xyz VALUES(?1);"

次に、バインド呼び出しを使用して の内容を割り当て?1ます。

于 2012-07-25T22:00:28.303 に答える