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

Ste*_*vid 4 sqlite xcode fmdb ios

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

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

FMResultSet *rs = [db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE '%Daimler%'"];
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试从用户输入插入searchQuery时,如下所示:

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

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

另外,为了您的方便,我在FMDB的文档中发布了一个部分.:)

Data Sanitization
Run Code Online (Sandbox Code Playgroud)

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

插入myTable VALUES(?,?,?)?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语句中显示%字符,则应使用%%.

小智 7

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

FMResultSet *rs = [db executeQuery:@"SELECT * FROM ZARTICLE WHERE ZTITLEDE LIKE ?", search_text];
Run Code Online (Sandbox Code Playgroud)