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

在Cocoa中构建字符串时使用单引号,cocoa,string,Cocoa,String,我正在Cocoa中构建一个字符串,用作SQL语句,它将被传递到sqlite的FMDB包装器中;但是,数据库会因访问失败而崩溃。我有以下代码: 前缀=@“从字段1类似“%”的表中选择* 中间=@“%”或类似“%”的字段2 后缀=@“%”顺序依据 orderby=@“%”按字段名排序 sqlStatement=[NSString stringWithFormat:@“%@%@%@%@%@%@%@”,前缀,搜索字符串,中间,搜索字符串,后缀,orderby] 在运行时,sqlStatement最终包含

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

前缀=@“从字段1类似“%”的表中选择*

中间=@“%”或类似“%”的字段2

后缀=@“%”顺序依据

orderby=@“%”按字段名排序

sqlStatement=[NSString stringWithFormat:@“%@%@%@%@%@%@%@”,前缀,搜索字符串,中间,搜索字符串,后缀,orderby]

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

从表中选择*,其中字段1类似于\'%A%\'或字段2类似于\'%A%\'按字段名排序

由于某种原因,将\添加到字符串中,从而导致数据库爆炸

你知道如何防止\出现在我的字符串中吗

更新:
当我通过NSLog输出变量时,我得到以下结果: 从表中选择*字段1如“OX1.87A8013DBD18F-1027”或字段2如“OX1.87A8013DBD18F-1027”按字段名排序


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

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

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

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

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

我猜您使用的是sqlite,在这种情况下,您希望使用稍微不同的方式。首先,创建如下查询:

SELECT * FROM Table WHERE Field1 LIKE ?001 OR Field2 LIKE ?002 ORDER BY Fieldnames
000语法用于参数

然后可以使用sqlite3\u bind\u text绑定参数:

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

希望这能为您指明正确的方向。

我猜您使用的是sqlite,在这种情况下,您希望做得稍有不同。首先,创建如下查询:

SELECT * FROM Table WHERE Field1 LIKE ?001 OR Field2 LIKE ?002 ORDER BY Fieldnames
000语法用于参数

然后可以使用sqlite3\u bind\u text绑定参数:

sqlite3_bind_text(statement, 1, [@"%bar%" UTF8String], -1, SQLITE_STATIC);
sqlite3_bind_text(statement, 2, [@"%foo%" UTF8String], -1, SQLITE_STATIC); 
希望这能为您指明正确的方向。

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

看来你的目标是

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

(gdb)po sql从t_状态选择* 其中state_code='XX'

字符串也会离开 去掉反斜杠。所以,我要说的是 对于某些情况,单引号被转义 仅在Xcode过程中进行推理 格式化要在中显示的对象 变量视图

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

看来你的目标是

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

(gdb)po sql从t_状态选择* 其中state_code='XX'

字符串也会离开 去掉反斜杠。所以,我要说的是 对于某些情况,单引号被转义 仅在Xcode过程中进行推理 格式化要在中显示的对象 变量视图


关于您的“更新”:

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

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


现在发生的情况是,您稍后将使用
sqlStatement
字符串作为格式控制字符串,这是不好的。如果您确实需要将
sqlStatement
传递给将字符串解释为格式说明符的方法/函数,则应该像
do_query(@“%@”,sqlStatement)一样传递它,以了解您的“更新”:

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

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


现在发生的情况是,您稍后将使用
sqlStatement
字符串作为格式控制字符串,这是不好的。如果您确实需要将
sqlStatement
传递给将字符串解释为格式说明符的方法/函数,您应该像
do_query(@“%@”,sqlStatement)一样传递它。

您的目标数据库是什么?请编辑原始帖子以正确格式化代码。您需要使用参数。请看我的帖子。你要针对什么数据库?请编辑原始帖子以正确设置代码格式。你需要使用参数。请参阅我的帖子。当我通过NSLog输出变量时,我得到以下信息:从表中选择*字段1,如“OX1.87A8013DBD18F-1027”,或字段2,如“OX1.87A8013DBD18F-1027”,按字段名排序。问题是搜索字符串。但当我通过NSLog输出该字段时,它看起来不错。\'s仅出现在调试器中。请使用A而不是blah来尝试您的代码,看看会发生什么。当我通过NSLog输出变量时,我会得到以下结果:从表中选择*,其中字段1如“OX1.87A8013DBD18F-1027”或字段2如“OX1.87A8013DBD18F-1027”按字段名排序。问题是搜索字符串。但当我通过NSLog输出该字段时,它看起来不错。\'s仅出现在调试器中。请使用A而不是blah来尝试您的代码,看看会发生什么。那么为什么sqlite Bombling的访问权限不好?为什么sqlite Bombling的访问权限不好?