如何解决iPhone中针对多个参数的SQLITE SELECT IN问题
| 我有一个方法,该方法从数据库生成返回值的字典:- (NSDictionary *)getParametersForPreset:(NSUInteger)presetID plants:(NSArray *)plants
{
NSString *loggers = @\"\";
NSString *invertors = @\"\";
NSString *plantsList = @\"\";
const char *sql = \"SELECT loggerID,invertorID FROM records WHERE presetID IN (?) AND plantID IN (?)\";
BOOL isEmpty = YES;
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database,sql,-1,&statement,NULL) != SQLITE_OK)
{
NSLog(@\"Error: \'%s\'.\",sqlite3_errmsg(database));
}
for (int i = 0; i < [plants count]; i++) {
if (i == 0)
{
plantsList = [NSString stringWithFormat:@\"\'%@\'\",[[plants objectAtIndex:0] valueForKey:@\"id\"]];
}
else
{
plantsList = [plantsList stringByAppendingFormat:@\",\'%@\'\",[[plants objectAtIndex:i] valueForKey:@\"id\"]];
}
}
NSLog(@\"plants: %@\",plantsList);
NSLog(@\"preset: %d\",presetID);
sqlite3_bind_int(statement,1,presetID);
sqlite3_bind_text(statement,2,[plantsList UTF8String],SQLITE_TRANSIENT);
NSMutableDictionary *dictionary = [[[NSMutableDictionary alloc] init] autorelease];
int i = 0;
while (sqlite3_step(statement) == SQLITE_ROW)
{
if (i == 0)
{
loggers = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,0)];
invertors = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,1)];
isEmpty = NO;
i++;
}
else
{
loggers = [loggers stringByAppendingFormat:@\",%@\",[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,0)]];
invertors = [invertors stringByAppendingFormat:@\",1)]];
}
}
sqlite3_reset(statement);
if (isEmpty == YES)
{
return nil;
}
[dictionary setValue:[NSString stringWithString:[plantsList stringByReplacingOccurrencesOfString:@\"\'\" withString:@\"\"]] forKey:@\"plants\"];
[dictionary setValue:loggers forKey:@\"loggers\"];
[dictionary setValue:invertors forKey:@\"invertors\"];
return dictionary;
}
该查询在代码中没有返回任何内容,但是随后我在Firefox的SQLite Manager中针对相同的数据库执行了相同的查询,它为我返回了正确的数据。拜托,帮我找出我的错误,我真的已经筋疲力尽了。
这是我在Manager中执行的查询:
SELECT loggerID,invertorID FROM records WHERE presetID=1 AND plantID IN (\'3\',\'2\',\'1\',\'6\',\'5\',\'4\')
这是代码的记录值:
preset: 1
plants: \'3\',\'4\'
非常感谢!
解决方法
我最近一直在研究类似的查询。
我有一个NSMutableArray,它存储ID的列表。我使用componentsJoinedByString函数将它们作为字符串加入。
然后,我有一个使用StringWithFormat函数保存SQL语句的NSString对象。
因此,用于生成SQLite查询的代码可能类似于:
NSString * query = [NSString stringWithFormat:@\"SELECT loggerID,invertorID FROM records WHERE presetID IN (%d) AND plantID IN (%@)\",presetID,[plantsList componentsJoinedByString:@\",\"]];
希望这可以帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。