在Cocoa中构建字符串时使用单引号

时间:2009-03-05 12:51:47

标签: cocoa string

我在Cocoa中构建一个字符串,用作SQL语句,将其传递给sqlite的FMDB包装器;但是,数据库因BAD_ACCESS失败而崩溃。我有以下代码:

prefix = @“SELECT * FROM Table WHERE Field1 LIKE'%”;

middle = @“%'或Field2 LIKE'%”;

suffix = @“%'ORDERY BY”;

orderby = @“%'ORDER BY Fieldnames”;

sqlStatement = [NSString stringWithFormat:@“%@%@%@%@%@%@”,前缀,searchString,middle,searchString,suffix,orderby];

在运行时,sqlStatement最终包含如下内容:

SELECT * FROM Table WHERE Field1 LIKE \'%A%\'或Field2 LIKE \'%A%\'ORDER BY Fieldnames

由于某种原因,正在将字符串添加到字符串中,导致数据库爆炸。

我有什么想法可以让\出现在我的字符串中吗?

更新: 当我通过NSLog输出我的变量时,我得到以下内容: SELECT * FROM表WHERE Field1 LIKE'OX1.87A8013DBD18F-1027'或Field2 LIKE'OX1.87A8013DBD18F-1027'ORDER BY Fieldname。

问题似乎是在字符串中使用%A。即使我硬编码sqlStatement变量以包含'%A%',%A似乎也会转换为内存地址或其他东西。如果我执行'%ABAP%',我会得到类似'OX1.87A8013DBD18F-1027BAP'的输出。请注意,我正在丢失%符号。

4 个答案:

答案 0 :(得分:4)

我猜你正在使用sqlite,在这种情况下你想要稍微改变一下。首先创建这样的查询:

SELECT * FROM Table WHERE Field1 LIKE ?001 OR Field2 LIKE ?002 ORDER BY Fieldnames

?000语法用于参数。

然后,您可以使用sqlite3_bind_text绑定参数:

sqlite3_bind_text(statement, 1, [@"%bar%" UTF8String], -1, SQLITE_STATIC);
sqlite3_bind_text(statement, 2, [@"%foo%" UTF8String], -1, SQLITE_STATIC); 

希望这应该指向正确的方向。

答案 1 :(得分:2)

关于“更新”:

看起来“%A”被用作格式说明符,即:

  

%A:64位浮点数(双精度),   用科学记谱法印刷   前导0X和一个十六进制数字   在小数点之前使用a   大写P引入指数

请参阅String Programming Guide for Cocoa

所以正在发生的事情是你以后使用sqlStatement字符串作为格式控制字符串,这很糟糕。如果确实需要将sqlStatement传递给将字符串解释为格式说明符的方法/函数,则应将其传递为do_query(@"%@", sqlStatement)

答案 2 :(得分:0)

字符串似乎构造正确。如果我运行代码:

int main(int argc, char *argv[])
{
    NSAutoreleasePool* pool = [NSAutoreleasePool new];

    NSString* prefix = @"SELECT * FROM Table WHERE Field1 LIKE '%";

    NSString* middle = @"%' OR Field2 LIKE '%";

    NSString* suffix = @"%' ORDERY BY ";

    NSString* orderby = @"%' ORDER BY Fieldnames";

    NSString* sqlStatement = [NSString stringWithFormat:@"%@%@%@%@%@%@", prefix, @"blah", middle, @"blah", suffix, orderby];

    NSLog(@"sqlStatement: %@", sqlStatement);

    [pool drain];

    return 0;
}

我在控制台中得到以下结果:

2009-03-05 08:04:29.734 Untitled[79999:813] sqlStatement: SELECT * FROM Table WHERE Field1 LIKE '%blah%' OR Field2 LIKE '%blah%' ORDERY BY %' ORDER BY Fieldnames

答案 3 :(得分:0)

“在运行时”是什么意思? 你的意思是在Xcode调试器中吗?

似乎您的目标是this problem

  

反斜杠转义的单引号   似乎只出现在里面   Xcode调试器窗口的变量   摘要栏目。检查的价值   在gdb中手动显示“sql”   格式正确:

     

(gdb)po sql select * from t_state   其中state_code ='XX'

     

和NSLogging字符串也离开了   出反斜杠。所以,我会说那些   一些单引号被转义   原因只在Xcode的过程中   格式化对象以便显示   变量视图。