2012-04-01 19 views
2

XcodeのSQLite3に問題があります。 問題は、私は、このデータベースを持っているということです。SQLite3ステートメントObj-CのSELECT、WHERE、ORDER BY

-------------------------| 
| 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 ""でクラッシュします。

私は治療法が間違っていると信じています。

誰かが助けることができたら、私は客観的に新しいですので、気をつけてください。

ありがとう!

答えて

1

個人的には、私はデバッガでコードをステップバイステップで実行し、問題の原因となっている行を正確に見ていきます。

他にも、私はあなたがChooseCompanyをどこに設定しているのかわかりません。それは適切に引用され、そのようなものですか?あなたはあなただけのユニークなモデル/会社の組み合わせを望んでいた上に述べたよう

また、あなたがモデル&、当社のユニークな組み合わせをしたい場合は、それだけで

SELECT Model, Company FROM Comp GROUP BY Model, Company 

もちろん、私は、あなたのロジックを知らないされていませんあなたのコードは、特定の会社のユニークなモデルを取得しようとしているようです。

最後に、FMDB(https://github.com/ccgus/fmdb)のようなSQLite3用のObjective Cラッパーがあり、sqlite3の雑草からこのようなものを呼び出すことができます。

+0

Robert、ご意見ありがとうございます。 ChoiceCompanyは以前ビューでクリックされた会社と同じです。私はただの会社のすべてのモデルを手に入れたいが、それぞれのモデルは一度だけだ。 'Select Model、Company FROM Comp GROUP BY Mode、Company'はこのトリックを行いますか? –

+0

たとえば、私は 'SELECTモデルFROM Comp WHERE Company = Audi'を使用しました。ただ、各モデルを一度見せたいだけです。どうやってするの? –

+0

そのための標準的なSQLは 'モデル選択FROM Comp WHERE Company = 'Audi' GROUP BY Model'です。 'GROUP BY'はあなたに一意の応答を与えるものです。また、 'モデル選択、COUNT(*)FROM Comp WHERE Company = 'Audi' GROUP BY Model'のようなものを実行することもできます。これは、モデルとそれがどれだけ出現したかを示します。ちなみに、 'Audi'の周りの一重引用符は、列名ではなくリテラル文字列として指定されています。 – Rob

1

私は自分自身がかなり緑色ですが、モデルだけを選択した場合、列0ではなく、列2ではなく、NSString * model = [NSString stringWithUTF8String:(char *)sqlite3_column_text(sqlStatement, 2)]; // Car models

+0

大丈夫でした。しかし、助けてくれてありがとう! –