Obite-C上的SQLite3语句SELECT,WHERE和ORDER BY

时间:2012-04-01 15:30:39

标签: iphone objective-c ios xcode sqlite

我在Xcode上遇到SQLite3问题。 问题是我有这个数据库:

-------------------------|
| 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“”。

我认为这个例子是错误的。

如果有人可以提供帮助,我是对Objective-c的新手,请耐心等待。

非常感谢!

2 个答案:

答案 0 :(得分:1)

我自己在SQLite上相当绿,但是如果你只选择模型,那么它不是第0列而不是第2行:NSString * model = [NSString stringWithUTF8String:(char *)sqlite3_column_text(sqlStatement, 2)]; // Car models

答案 1 :(得分:1)

就个人而言,我会在调试器中逐行逐步执行代码,并准确查看导致问题的行。

顺便说一句,我不知道你在哪里设置了TheChoosenCompany。是否正确引用了这样的东西?

另外,如果你想要Model&的独特组合公司,不仅仅是

SELECT Model, Company FROM Comp GROUP BY Model, Company

显然我不知道你的逻辑,正如你上面所说,你只想要独特的模型/公司组合,但你的代码似乎试图检索给定公司的独特模型。

最后,有SQLite3的Objective C包装器,例如FMDB(在https://github.com/ccgus/fmdb),它可以帮助你摆脱sqlite3调用的杂草。