2

我已经搜索了所有问题,但还没有找到答案。我最接近的是通过 FMDB 将数组传递给 sqlite WHERE IN 子句?. 但是,建议的答案似乎不起作用。该命令不会引发任何错误,但它也不会执行预期的操作(例如 DELETE)。这就是我想要做的:

[myDB executeUpdateWithFormat:@"DELETE FROM table WHERE row_id IN (%@)",rowIdsToBeDeleted];

rowIdsToBeDeleted 是一个逗号分隔的 NSString 包含 rowIds 作为 NSNumber 对象,例如

1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012

我什至尝试使用 executeUpdate,但没有运气。你们中的任何人都可以帮忙吗?

4

2 回答 2

4

你可以简单地做:

[myDB executeUpdate:[NSString stringWithFormat:@"DELETE FROM table WHERE row_id IN (%@)",rowIdsToBeDeleted]];

尽管人们可能会从方法名称中推断出什么,但该executeUpdateWithFormat方法不执行传统的printf- 样式格式。在幕后,它真正做的是遍历格式字符串,用?占位符替换 printf 样式的字符串,然后尝试使用适当的sqlite3_bind_xxx函数将值绑定到这些占位符。

这种实现executeUpdateWithFormat引入了各种微妙的问题。(因此,它很可能在未来的 FMDB 版本中被弃用。)在这种特殊情况下,问题是sqlite3_bind_xxx不能将逗号分隔的字符串绑定为要绑定到单个?占位符的值数组。

通常应该避免使用stringWithFormat(或 Swift 字符串插值)来构建要传递给 FMDB 或 SQLite 的 SQL 语句,因为如果操作不当,您可能会受到 SQL 注入攻击和/或如果您未能正确转义字符串值则失败。但是这个例子,你想要测试某个数值是否在一组数值中,是该规则的一个例外,你可以使用stringWithFormat如上所示。

于 2012-07-17T17:08:54.223 回答
-2

如果该方法类似于 NSPredicate 语法,只需删除括号(它们会为您处理(并传入集合而不是字符串):

NSArray *ids = [rowIdsToBeDeleted componentsSeparatedByString:@","];
[myDB executeUpdateWithFormat:@"DELETE FROM table WHERE row_id IN %@",ids];

编辑

另外,通常你传入一个实际的集合对象(不是字符串)......上面经过编辑以反映

于 2012-07-17T17:07:52.730 回答