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:@\",\"]];
希望这可以帮助。