我在xcode中遇到sqlite3_prepare_v2的问题,我在这个类的每个地方使用sqlite,我的所有代码都可以工作,但不是这个:
sqlite3_stmt *statement;
NSMutableArray *results = [[NSMutableArray alloc] init];
if( sqlite3_prepare_v2( self.database, "SELECT * FROM students WHERE ( UPPER( name ) LIKE '%?%' ) OR ( LOWER( name ) LIKE '%?%' ) OR ( UPPER( firstname ) LIKE '%?%' ) OR ( LOWER( firstname ) LIKE '%?%' ) ORDER BY name, firstname", -1, &statement, nil ) != SQLITE_OK )
{
NSLog(@"SQLITE: Failed to prepare statement! Error: '%s'", sqlite3_errmsg(self.database));
return results;
}
sqlite3_bind_text(statement, 1, [[name uppercaseString] UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(statement, 2, [[name lowercaseString] UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(statement, 3, [[firstname uppercaseString] UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(statement, 4, [[firstname lowercaseString] UTF8String], -1, SQLITE_TRANSIENT);
然后
while(sqlite3_step(statement)== SQLITE_ROW){ ... [结果addObject:p]; }
最后
sqlite3_finalize(statement);
当我通过
更改sql select时,此代码有效SELECT * FROM students
当我在navicat中测试时,我的数据库表学生返回12行。
感谢您的帮助!
答案 0 :(得分:0)
所有sqlite3_bind_text
次调用都返回SQLITE_RANGE
,因为此语句没有任何参数。
像'%?%'
这样的字符串中的问号只是一个普通字符。
对于参数,问号必须在任何字符串之外。
要将百分号添加到该字符串中,您必须将它们全部连接起来:
... WHERE name LIKE '%' || ? || '%' ...
(请注意,LIKE不区分大小写; UPPER或LOWER不会改变任何内容。)