在Cocoa中构建字符串时使用单引号
我正在Cocoa中构建一个字符串,用作SQL语句,它将被传递到sqlite的FMDB包装器中;但是,数据库会因访问失败而崩溃。我有以下代码: 前缀=@“从字段1类似“%”的表中选择* 中间=@“%”或类似“%”的字段2 后缀=@“%”顺序依据 orderby=@“%”按字段名排序 sqlStatement=[NSString stringWithFormat:@“%@%@%@%@%@%@%@”,前缀,搜索字符串,中间,搜索字符串,后缀,orderby] 在运行时,sqlStatement最终包含如下内容: 从表中选择*,其中字段1类似于\'%A%\'或字段2类似于\'%A%\'按字段名排序 由于某种原因,将\添加到字符串中,从而导致数据库爆炸 你知道如何防止\出现在我的字符串中吗 更新:在Cocoa中构建字符串时使用单引号,cocoa,string,Cocoa,String,我正在Cocoa中构建一个字符串,用作SQL语句,它将被传递到sqlite的FMDB包装器中;但是,数据库会因访问失败而崩溃。我有以下代码: 前缀=@“从字段1类似“%”的表中选择* 中间=@“%”或类似“%”的字段2 后缀=@“%”顺序依据 orderby=@“%”按字段名排序 sqlStatement=[NSString stringWithFormat:@“%@%@%@%@%@%@%@”,前缀,搜索字符串,中间,搜索字符串,后缀,orderby] 在运行时,sqlStatement最终包含
当我通过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的访问权限不好?