Objective C sqlite3问题

时间:2011-06-30 18:37:09

标签: iphone objective-c ios sqlite

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

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

这个问题是否有意义?洛尔。

4 个答案:

答案 0 :(得分:12)

sqlite要求'符号被两个人逃脱'。

official sqlite FAQ

中查看此内容
(14) How do I use a string literal that contains an embedded single-quote (') character?

The SQL standard specifies that single-quotes in strings are escaped by putting two single quotes in a row. SQL works like the Pascal programming language in the regard. SQLite follows this standard. Example:

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

答案 1 :(得分:5)

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

  1. 自己做格式化。 不要这样做。(好吧,除非这个字符串是代码的一部分而不是用户输入。在这种情况下,这种方法很好。)
  2. 使用sqlite3_mprintf("%Q")让SQLite执行此操作。 (%q引用替换; %Q引用替换并为空指针插入NULL。)
  3. 在您使用sqlite3_bind_text填写的对帐单中使用绑定。这是执行此操作的最佳方法,因为它不需要为每个字符串重新编译语句,也不会将您打开到SQL Injection
  4. 使用绑定看起来像这样:

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

    (不要忘记进行错误检查。)

答案 2 :(得分:5)

嘿,忘了所有这些东西。如果你想让你的数据库包含'。只需用%27&更换你的字符串即可。取回它时将其转换回来。你会得到你想要的。检查以下内容:

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

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

享受编程:):)

答案 3 :(得分:3)

SQLite提供了一个可以根据需要转义字符的函数。看一眼: sqlite3_mprintf

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