我认为你可以加入“?”在“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 *
类型答案 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。