SQLite3 оператор SELECT, WHERE и ORDER BY на Obj-C - PullRequest
2 голосов
/ 01 апреля 2012

У меня проблема с SQLite3 на Xcode.проблема в том, что у меня есть эта база данных:

-------------------------|
| ID | Company  |  Model |
|------------------------|
| 1  | Audi     |  A4    |
| 2  | Audi     |  A4    |
| 3  | Audi     |  A3    |
| 4  | Audi     |  A4    |
| 5  | BMW      |  330Ci |
| 6  | BMW      |  330Ci |
| 7  | BMW      |  750i  |
| 8  | Mercedes |  CL65  |
| 9  | Mercedes |  CL65  |
--------------------------

Я хочу, чтобы sqlite3 показывал мне так:

-------------------------|
| ID | Company  |  Model |
|------------------------|
| 1  | Audi     |  A4    |
| 2  | Audi     |  A3    |
| 3  | BMW      |  330Ci |
| 4  | BMW      |  750i  |
| 5  | Mercedes |  CL65  |
--------------------------

У меня есть эта функция:

-(NSString *)loadModel
{
    thecars = [[NSString alloc]initWithFormat:@"The data has been loaded to the pickers."];
    sqlite3_stmt * sqlStatement;
    @try {
        NSString *dbPath = [self path];
        if(sqlite3_open([[self path]UTF8String], &db) == SQLITE_OK)
        {
            NSLog(@"**** Database found at path.");
        }
        if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK))
        {
            NSLog(@"**** An error has occured: %@", sqlite3_errmsg(db));
        }
        NSString * hello = [NSString stringWithFormat:@"SELECT DISTINCT Model FROM Comp WHERE Company=%@",theChoosenCompany];
        const char * sql = [hello UTF8String];
        if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK)
        {
            NSLog(@"**** Problem with prepare statement: %@", sqlite3_errmsg(db));
        }
        else
        {
            while (sqlite3_step(sqlStatement) == SQLITE_ROW) {
                NSString * model = [NSString stringWithUTF8String:(char *)sqlite3_column_text(sqlStatement, 2)]; // Car models
                [modelsArray addObject:model];
            }
        }
    }
    @catch (NSException *exception) {
        NSLog(@"**** Problem with prepare statement:  %@", sqlite3_errmsg(db));
    }
    @finally {
        sqlite3_finalize(sqlStatement);
        sqlite3_close(db);
        return thecars;
    }
}

проблема в том, что я всегда получаю сообщение об ошибке, а программа с ошибкой "Поток 1: Программа получила сигнал:" EXC_BAD_ACCESS "".

Я считаю, что оценка неправильная.

Пожалуйстаесли кто-то может помочь, я новичок в объективе-c, поэтому, пожалуйста, будьте терпеливы.

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

Ответы [ 2 ]

1 голос
/ 01 апреля 2012

Лично я бы начал построчно просматривать код в отладчике и точно видеть, какая строка вызывает проблему.

Кроме того, я не вижу, где вы устанавливаете TheChoosenCompany. Это правильно процитировано и тому подобное?

Также, если вам нужны уникальные комбинации Model & Company, не так ли просто

SELECT Model, Company FROM Comp GROUP BY Model, Company

Очевидно, я не знаю вашей логики, как вы сказали выше, вам нужны только уникальные комбинации Модель / Компания, но ваш код, похоже, пытается получить уникальные модели для данной компании.

Наконец, существуют обёртки Objective C для SQLite3, такие как FMDB (на https://github.com/ccgus/fmdb),, которые избавят вас от сорняков вызовов sqlite3 для подобных вещей.

1 голос
/ 01 апреля 2012

Я довольно зеленый на SQLite, но если вы выберете только модели, будет ли это столбец 0, а не столбец 2 в этой строке: NSString * model = [NSString stringWithUTF8String:(char *)sqlite3_column_text(sqlStatement, 2)]; // Car models?

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