Создать общую функцию для выбора базы данных - PullRequest
1 голос
/ 04 июня 2011

Я разрабатываю приложение для iPhone.У меня есть функция, которая читает данные из базы данных sqlite и помещает результаты в массив.Все отлично работаетВот часть функции, которая заполняет массив:

while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
    NSString *aVar1 = [NSString stringWithUTF8String(char*)sqlite3_column_text(compiledStatement, 0)];
    NSString *aVar2 = [NSString stringWithUTF8String(char*)sqlite3_column_text(compiledStatement, 1)];

    NSArray  *anArray = [NSArray arrayWithObjects:aVar1,aVar2,nil];
    [returnArray addObject:anArray]
    [anArray release];
}
//return the array

Я хочу сделать эту функцию более общей, чтобы она принимала строку оператора SQL в качестве параметра и возвращала изменяемый массив массивов, независимо от того,в наборе результатов много столбцов.

Есть ли способ сделать это?Решение не должно включать массивы - это может быть любой объект коллекции.Я просто ищу способ повторно использовать функцию для других запросов к той же базе данных.

Ответы [ 2 ]

0 голосов
/ 10 мая 2013
+(NSArray *)executeQueryAndReturnArray:(NSString *)query {
    sqlite3_stmt *statement = nil;
    const char *sql = [query UTF8String];
    if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) != SQLITE_OK) {
        NSLog(@"[SQLITE] Error when preparing query!");
    } else {
        NSMutableArray *result = [NSMutableArray array];
        while (sqlite3_step(statement) == SQLITE_ROW) {
            NSMutableArray *row = [NSMutableArray array];
            for (int i = 0; i < sqlite3_column_count(statement); i++) {
                int colType = sqlite3_column_type(statement, i);
                id value;
                if (colType == SQLITE_TEXT) {`enter code here`
                    const unsigned char *col = sqlite3_column_text(statement, i);
                    value = [NSString stringWithFormat:@"%s", col];
                } else if (colType == SQLITE_INTEGER) {
                    int col = sqlite3_column_int(statement, i);
                    value = [NSNumber numberWithInt:col];
                } else if (colType == SQLITE_FLOAT) {
                    double col = sqlite3_column_double(statement, i);
                    value = [NSNumber numberWithDouble:col];
                } else if (colType == SQLITE_NULL) {
                    value = [NSNull null];
                } else {
                    NSLog(@"[SQLITE] UNKNOWN DATATYPE");
                }
                [row addObject:value];
            }
            [result addObject:row];
        }
        return result;
    }
    return nil;
}
0 голосов
/ 04 июня 2011

Не могли бы вы просто сделать что-то вроде:

int numCols = sqlite3_column_count(compiledStatement);
NSMutableArray *result = [NSMutableArray array];
while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
    NSMutableArray *array = [NSMutableArray array];
    for (int i = 0; i < numCols; i++) {
        [array addObject:
         [NSString stringWithUTF8String:
          (char *)sqlite3_column_text(compiledStatement, i)]];
    }
    [result addObject:array];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...