lonlywolf
lonlywolf

Reputation: 505

Problem with SQLITE SELECT IN for multiple parameters in iPhone

I have a method, which generates a dictionary of returned values from database:

- (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], -1, 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:@",%@",[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 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;

}

This query returns me nothing in the code, but then I do the same query in the SQLite Manager in Firefox for the same database, it returns me the correct data. Please, help me find my mistakes, I'm really exhausted of this.

Here is the query I do in Manager:

SELECT loggerID, invertorID FROM records WHERE presetID=1 AND plantID IN ('3','2','1','6','5','4')

And here are logged values from the code:

preset: 1

plants: '3','2','1','6','5','4'

Thanks a lot!

Upvotes: 0

Views: 2479

Answers (1)

MattStacey
MattStacey

Reputation: 895

I have recently been working on similar query.

I had a NSMutableArray which stored a list of ID's. I joined them as a string using the function componentsJoinedByString.

I then had a NSString object which held my SQL statement, using the stringWithFormat function.

So your code to generate the SQLite query could be along the lines of:

NSString * query = [NSString stringWithFormat:@"SELECT loggerID, invertorID FROM records WHERE presetID IN (%d) AND plantID IN (%@)",presetID,[plantsList componentsJoinedByString:@","]];

Hope this helps.

Upvotes: 1

Related Questions