Проблема с SQLITE SELECT IN для нескольких параметров в iPhone - PullRequest
0 голосов
/ 27 мая 2011

У меня есть метод, который генерирует словарь возвращаемых значений из базы данных:

- (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;

}

Этот запрос ничего не возвращает мне в коде, но затем я делаю тот же запрос в SQLite Manager в Firefox длята же база данных, она возвращает мне правильные данные.Пожалуйста, помогите мне найти мои ошибки, я действительно исчерпан этим.

Вот запрос, который я делаю в Менеджере:

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

И здесь вошлизначения из кода:

preset: 1

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

Большое спасибо!

1 Ответ

1 голос
/ 27 мая 2011

Недавно я работал над аналогичным запросом.

У меня был NSMutableArray, в котором хранился список идентификаторов.Я соединил их как строку, используя функцию componentsJoinedByString.

Затем у меня был объект NSString, в котором содержался мой оператор SQL, с использованием функции stringWithFormat.

Так что ваш код для генерации запроса SQLiteвдоль линий:

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...