sqlite3_prepare_v2返回0行

时间:2014-03-11 16:34:23

标签: ios sql objective-c sqlite

我在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行。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

所有sqlite3_bind_text次调用都返回SQLITE_RANGE,因为此语句没有任何参数。

'%?%'这样的字符串中的问号只是一个普通字符。 对于参数,问号必须在任何字符串之外。

要将百分号添加到该字符串中,您必须将它们全部连接起来:

... WHERE name LIKE '%' || ? || '%' ...

(请注意,LIKE不区分大小写; UPPER或LOWER不会改变任何内容。)