我在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的新手,请耐心等待。
非常感谢!
答案 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调用的杂草。