Запрос SQLite3, возвращающий 0 для всех записей в iOS 5 - PullRequest
0 голосов
/ 15 декабря 2011

Хорошо, так что я поправляюсь с запросами SQLite ... но, очевидно, еще не мастер.

Я пытаюсь перебрать возвращаемый массив, и все, что я получаю, это 0 для каждой записи.

Вот что вызывает запрос и возвращает результат (этот конкретный запрос в настоящее время должен возвращать 6 строк данных):

-(NSMutableArray *)getMyAthleteList
{
NSMutableArray *athleteList = [[NSMutableArray alloc] init];

NSString *getAthleteListSQL = [[NSString alloc] initWithFormat:@"SELECT * FROM athletes"];

sqlite3_stmt *selectStmt;

if (sqlite3_prepare_v2(database, [getAthleteListSQL UTF8String], -1, &selectStmt, nil)==SQLITE_OK)
{
    while (sqlite3_step(selectStmt)==SQLITE_ROW)
    {
        //NSLog(@"Adding athletes to the array");
        Athletes *athlete_array = [Athletes alloc];
        athlete_array.athlete_image = [[NSString alloc] initWithFormat:@"%d",sqlite3_column_int(selectStmt, 0)];
        athlete_array.athlete_id = [[NSString alloc] initWithFormat:@"%d",sqlite3_column_int(selectStmt, 1)];
        athlete_array.athlete_name = [[NSString alloc] initWithFormat:@"%d",sqlite3_column_int(selectStmt, 2)];
        athlete_array.school_name = [[NSString alloc] initWithFormat:@"%d",sqlite3_column_int(selectStmt, 3)];
        athlete_array.sport_name = [[NSString alloc] initWithFormat:@"%d",sqlite3_column_int(selectStmt, 4)];
        athlete_array.athlete_flag = [[NSString alloc] initWithFormat:@"%d",sqlite3_column_int(selectStmt, 5)];
        [athleteList addObject:athlete_array];
    }
}
else
{
    NSLog(@"Did not make a good query");
}

return athleteList;
}

Теперь вот что я делаю при вызове и циклическом просмотре:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

NSArray *myAthleteList = [[NSArray alloc] initWithArray:[appDelegate getMyAthleteList]];

for (Athletes *athlete in myAthleteList) {
    NSLog(@"Athlete Name: %@", athlete.athlete_name);
    NSLog(@"Athlete ID: %@", athlete.athlete_id);
}

И вывод:

Имя спортсмена: 0 ID спортсмена: 0

Все мои строки (имя спортсмена, идентификатор спортсмена и т. Д.) Определены правильно (в моих файлах Athletes.m и .h).

Я уверен, что упускаю что-то простое, но любая помощь будет высоко оценена.

Спасибо!

1 Ответ

1 голос
/ 15 декабря 2011

Ожидаете ли вы, что строки, подобные этой, будут возвращать строку из БД?

athlete_array.athlete_name = [[NSString alloc] initWithFormat:@"%d",
                              sqlite3_column_int(selectStmt, 2)];

Если это так, вы можете посмотреть sqlite3_column_text или text16

См .: http://www.sqlite.org/capi3ref.html#sqlite3_column_blob

Вы также можете использовать это, так как он возвращает константный символ *:

[[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(...)

Например, вот аналогичный фрагмент из одного из моих примеров:

contact = [[Contact alloc] init];
while (sqlite3_step(statement) == SQLITE_ROW)
{
    int idx = 0;

    NSNumber *idField = [NSNumber numberWithLongLong:sqlite3_column_int64(statement, idx++)];
    [contact setId:idField];

    NSString *nameField = [[NSString alloc] initWithUTF8String:
                           (const char *) sqlite3_column_text(statement, idx++)];
    [contact setName:nameField];

    NSString *addressField = [[NSString alloc] initWithUTF8String:
                            (const char *) sqlite3_column_text(statement, idx++)];
    [contact setAddress:addressField];

    NSString *phoneField = [[NSString alloc] initWithUTF8String:
                            (const char *) sqlite3_column_text(statement, idx)];
    [contact setPhone:phoneField];

    NSLog(@"id: %@", [contact id]);
    NSLog(@"name: %@", [contact name]);            
    NSLog(@"address: %@", [contact address]);
    NSLog(@"phone: %@", [contact phone]);

    // Code to do something with extracted data here

    [nameField release];
    [phoneField release];
    [addressField release];
}

Кроме того, посмотрите, как сохранить скомпилированный оператор & selectStmt и вызвать sqlite3_reset для повторного использования.В этот момент он скомпилирован в байт-код, и вам не нужно анализировать и компилировать оператор SQL снова и снова.

См .: http://www.sqlite.org/capi3ref.html#sqlite3_prepare

Когда вы закончитес оператором (полностью, если вы сохраните его), не забудьте вызвать sqlite3_finalize.

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