FMDB问题并在searchString的“executeQuery:”中插入值

时间:2011-07-15 16:46:30

标签: ios xcode sqlite fmdb

在构建搜索我的应用程序时,我在使用FMDB SQLite Wrapper(https://github.com/ccgus/fmdb)时遇到了问题。

当我用这个SQL命令搜索我的数据库时,一切都很好。返回13个对象,我可以使用它们。

FMResultSet *rs = [db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE '%Daimler%'"];

但是当我尝试从用户输入中插入searchQuery时:

FMResultSet *rs = [db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE (?)", theSearchQuery];

...该值不会插入SQL命令。而且我没有从DB获得任何返回的对象。即使String(theSearchQuery)与第一个例子中写的相同。

另外,我会在FMDB的文档中发布一个部分,以方便您使用。 :)

Data Sanitization

在向FMDB提供SQL语句时,不应尝试在插入之前“清理”任何值。相反,您应该使用标准的SQLite绑定语法:

插入myTable值(?,?,?) 的? SQLite将字符识别为要插入的值的占位符。执行方法都接受可变数量的参数(或这些参数的表示,例如NSArray或va_list),这些参数可以为您正确转义。

因此,你不应该这样做(或类似的事情):

[db executeUpdate:[NSString stringWithFormat:@“INSERT INTO myTable VALUES(%@)”,@“这有很多'奇异的'”引号'“]]; 相反,你应该这样做:

[db executeUpdate:@“INSERT INTO myTable VALUES(?)”,@“这里有很多'奇怪的”引号'“]; 提供给-executeUpdate:方法的所有参数(或接受va_list作为参数的任何变体)都必须是对象。以下操作无效(并将导致崩溃):

[db executeUpdate:@“INSERT INTO myTable VALUES(?)”,42]; 插入数字的正确方法是在NSNumber对象中将其打包:

[db executeUpdate:@“INSERT INTO myTable VALUES(?)”,[NSNumber numberWithInt:42]]; 或者,您可以使用-execute * WithFormat:variant来使用NSString样式的替换:

[db executeUpdateWithFormat:@“INSERT INTO myTable VALUES(%d)”,42]; 在内部,-execute * WithFormat:方法正适合你。识别以下百分比修饰符:%@,%c,%s,%d,%D,%i,%u,%U,%hi,%hu,%qi,%qu,%f,%g,% ld,%lu,%lld和%llu。使用除此之外的修饰符将产生不可预测的结果。如果出于某种原因,您需要在SQL语句中显示%字符,则应使用%%。

2 个答案:

答案 0 :(得分:7)

NSString *search_text = [NSString stringWithFormat:@"%%%@%%", theSearchQuery];

FMResultSet *rs = [db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE ?", search_text];

答案 1 :(得分:4)

我强烈建议避免使用stringWithFormat创建查询:! FMDB试图强迫您使用数据清理是有充分理由的。但是,由于FMDB正在装入您的输入,因此不需要以下代码中的左括号,这可能会导致您的问题。

[db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE (?)", theSearchQuery];

简单地添加没有任何parenthisis的参数,因为你永远不知道FMDB如何在内部装箱你的参数。

[db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE ?", theSearchQuery];

如果仍然无效,请尝试使用FMDB建议的executeQueryWithFormat:方法:

[db executeQueryWithFormat:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE %@", theSearchQuery];