你怎么用“?”在executeQuery方法中使用sqlite语句?

时间:2010-07-23 03:38:59

标签: iphone sqlite

我认为你可以加入“?”在“executeQuery”方法中提供的sqlite语句中,传递对应于每个“?”的其他参数。但是当我把它付诸实践时,结果并不一致。

此声明有效:

SELECT * FROM answers WHERE test_id = ? and question_id = ?

使用此方法

FMResultSet * answer = [[UIApp database] executeQuery:[Queries getTheAnswer], l, n];

当我添加"?"

时,以下语句会使程序崩溃
SELECT * FROM questions where test_id = ? ORDER BY RANDOM() LIMIT ?
FMResultSet * set = [[UIApp database] executeQuery:[Queries randomNumberOfVerses], selectedTests, numRounds];

但是当我对一个值进行硬编码时工作正常。

SELECT * FROM questions where test_id = 5 ORDER BY RANDOM() LIMIT ?
FMResultSet * set = [[UIApp database] executeQuery:[Queries randomNumberOfVerses], numRounds];

任何建议,因为我不想硬编码值?用作参数的所有变量都是NSNumber *

类型

2 个答案:

答案 0 :(得分:1)

我不知道iPhone或Objective C,但通常?个参数用于预备语句,而不是“立即模式”查询。

SQLite C API中,您感兴趣的功能称为sqlite3_prepare*()

如果你能弄清楚Objective C的映射是什么,你应该可以取得一些进展。

编辑:

我几乎忘记了实际回答你问题的部分......

准备好语句后,使用sqlite3_bind*()函数为查询参数赋值。

答案 1 :(得分:0)

虽然WHERE子句可以包含bind-parameters,但LIMIT参数不能。它必须是整数字面值。请参阅SQLite Syntax Diagram

鉴于此,我不确定为什么你的最后一个工作正常。如果您对LIMIT参数进行硬编码,离开test_id = ?应该没问题,但是在使用时它应该不起作用?对于LIMIT。