Objective C sqlite3问题

Posted

技术标签:

【中文标题】Objective C sqlite3问题【英文标题】:ObjectiveC sqlite3 issue 【发布时间】:2011-09-26 05:43:06 【问题描述】:

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

在使用带撇号的字符串之前是否应该检查?有没有一种快速的方法来添加格式,在每个撇号前面添加一个转义字符?

这个问题有意义吗?哈哈。

【问题讨论】:

听起来您正在自己构建一个 SQL 查询字符串。不要那样做。请改用 FMDB 之类的包装器,它会为您处理此问题。 【参考方案1】:

sqlite 要求 ' 符号被两个 '' 转义。

从official sqlite FAQ看这个:

(14) 如何使用包含嵌入式单引号 (') 字符的字符串文字?

SQL 标准指定字符串中的单引号通过将两个单引号放在一行中来进行转义。在这方面,SQL 的工作方式类似于 Pascal 编程语言。 SQLite 遵循这个标准。例子:

    插入 xyz 值('5 点钟');

【讨论】:

有没有一种快速的方式来表达“newString = oldString + 双引号” 使用:newString=[oldString stringByReplacingOccurrencesOfString:@"'" withString:@"''"];【参考方案2】:

嘿,忘记所有这些东西。如果您希望您的数据库包含 ' 。只需将您的字符串替换为 %27 并在取回时将其转换回来。你会得到你想要的。检查以下:

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

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

享受编程:) :)

【讨论】:

【参考方案3】:

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

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

使用绑定如下所示:

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

(别忘了做错误检查。)

【讨论】:

我相信你颠倒了 sqlite3_prepare 中最后两个参数的顺序。我认为最好的解决方案应该是 sqlite3_prepare(db, "INSERT INTO Table(Column) VALUES(?);", -1, &stmt, NULL); +1。【参考方案4】:

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

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

【讨论】:

以上是关于Objective C sqlite3问题的主要内容,如果未能解决你的问题,请参考以下文章

objective-c数组

如何在Objective C中将对象序列化为JSON? [复制]

Objective C 自动释放

第一章-了解Objective - C语言的起源

objective-c sqlite3 数据库更改不是持久的

用makefile文件执行sqlite3