ObjectiveC sqlite3问题

我发现当我的iPhone应用程序更新/插入到我的表中时,我有一个问题,因为我有一个文本列,当该文本包含一个符号,事情会搞砸。 处理这个问题的最好方法是什么?

在使用带有撇号的string之前,我应该检查一下吗? 有没有一个快速的方法来添加格式,将在每个撇号前添加一个转义字符?

这个问题甚至有道理吗? 大声笑。

sqlite需要“符号被两个转义”。

从官方的sqlite FAQ看这个:

  (14)如何使用包含embedded式单引号(')字符的string文字?

 SQL标准指定通过在一行中放置两个单引号来逃避string中的单引号。 在这方面,SQL就像Pascal编程语言一样工作。  SQLite遵循这个标准。 例:

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

嘿忘记所有这些东西。 如果你想让你的数据库包含'。 只需用%27replace你的string,然后将其提取回去就可以了。 你会得到你想要的。 检查如下:

// while Inserting into db str = [str stringByReplacingOccurrencesOfString:@"'" withString:@"%27"]; // while fetching it back text = [text stringByReplacingOccurrencesOfString:@"%27" withString:@"'"]; 

享受编程:) 🙂

有三种方法可以解决这个问题:

  1. 自己做格式化。 不要这样做。 (好吧,除非这个string是你的代码而不是用户input的一部分,那么这种方法就没问题了。)
  2. 使用sqlite3_mprintf("%Q")让SQLite做到这一点。 ( %q引用replace; %Q引用replace,并为空指针插入NULL。)
  3. 在你的语句中使用你用sqlite3_bind_text填充的绑定。 这是这样做的最好方法,因为它不需要为每个string重新编译语句,也不会打开SQL注入 。

使用绑定将如下所示:

 sqlite3_prepare(db, "INSERT INTO Table(Column) VALUES(?);", -1, &stmt, NULL); sqlite3_bind_text(stmt, 1, [str cStringUsingEncoding:NSUTF8StringEncoding], -1, SQLITE_TRANSIENT); // stepping, etc 

(不要忘记做错误检查。)

有一个SQLite提供的function,可以根据需要转义字符。 看看:sqlite3_mprintf

http://www.sqlite.org/c3ref/mprintf.html