第一次使用 fmdb,尝试开始正确的操作。我有一个简单的单个表,我希望对其执行 SELECT WHERE .. LIKE 查询,并且在尝试了几种记录的方法之后,我无法得到任何结果来产生正确的结果。
e.g.
// 'filter' is an NSString * containing a fragment of
// text that we want in the 'track' column
NSDictionary *params =
[NSDictionary dictionaryWithObjectsAndKeys:filter, @"filter", nil];
FMResultSet *results =
[db executeQuery:@"SELECT * FROM items WHERE track LIKE '%:filter%' ORDER BY linkNum;"
withParameterDictionary:params];
Or
results = [db executeQuery:@"SELECT * FROM items WHERE track LIKE '%?%' ORDER BY linkNum;", filter];
Or
results = [db executeQuery:@"SELECT * FROM items WHERE track LIKE '%?%' ORDER BY linkNum;" withArgumentsInArray:@[filter]];
我已经逐步完成,所有方法都集中在 fmdb 方法中:
- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arrayArgs orDictionary:(NSDictionary *)dictionaryArgs orVAList:(va_list)args
根据方法,以及哪些参数为零,然后它要么调用sqlite3_bind_parameter_count(pStmt)
,它总是返回零,或者,对于字典情况,调用sqlite3_bind_parameter_index(..)
,它也返回零,因此参数不会被放入 LIKE 中,然后查询的结果集是错误的。
我知道这绝对是错误的方法(SQL 注入),但这是我成功获得 LIKE 荣誉的唯一方法:
NSString *queryString = [NSString stringWithFormat:@"SELECT * FROM items WHERE track LIKE '%%%@%%' ORDER BY linkNum;", filter];
results = [db executeQuery:queryString];
(我也尝试了所有排列,但用转义双引号代替此处显示的单引号)
Update:
我还尝试了 fmdb 自己的 ...WithFormat 变体,它应该提供便利并防止注入:
[db executeQueryWithFormat:@"SELECT * FROM items WHERE track LIKE '%%%@%%' ORDER BY linkNum;", filter];
再次进入调试器,我可以看到 LIKE 已从此转换:
… LIKE '%%%@%%' ORDER BY linkNum;
To this:
… LIKE '%%?%' ORDER BY linkNum;
...这也继续返回零sqlite3_bind_parameter_count()
,我期望一个正值等于“最大(最右边)参数的索引”。 (来自 sqlite 文档)