我在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'的输出。请注意,我正在丢失%符号。
答案 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的过程中 格式化对象以便显示 变量视图。