2012-04-23 3 views
0

このプログラムを実行してSQLiteデータベースに接続すると、パステストをパスしてデータベースを開き、SQLは実際のデータベースで動作します。次に、sqlite3_prepareステートメントを実行しようとすると失敗します。これは、1 - SQLエラーまたは欠落したデータベースのコードで終了します。その後、データベースから取得したデータを読み込もうとするまで、プログラムを継続します。 SQLエラーまたはsqlite3_prepareステートメントのデータベースコードが見つからないために何も得られなかったため、失敗します。私は間違っているコードの部分を探しています/ sqlite3_preparedステートメントで成功するように修正することができます。sqlite3_prepare()の問題Objective C

#import "contactDAO.h" 
#import "contact.h" 

@implementation contactDAO 

- (NSMutableArray *) getList{ 
NSMutableArray *contactArray = [[NSMutableArray alloc] init]; 
@try { 
    NSFileManager *fileMgr = [NSFileManager defaultManager]; 
    NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"iFLY.sqlite"]; 
    BOOL success = [fileMgr fileExistsAtPath:dbPath]; 
    if(!success) 
    { 
     NSLog(@"Cannot locate database file '%@'.", dbPath); 
    } 
    if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK)) 
    { 
     NSLog(@"An error has occured."); 
    } 
    const char *sql = "SELECT reportNumber, dateEntered, country, state FROM CONTACT"; 
    sqlite3_stmt *sqlStatement; 
    if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK) 
    { 
     NSLog(@"Problem with prepare statement"); 
    } 

    // 
    while (sqlite3_step(sqlStatement)==SQLITE_ROW) { 
     Contact *contactInfo; 

     contactInfo.reportNumber = sqlite3_column_int(sqlStatement, 0); 
     contactInfo.dateEntered = sqlite3_column_int(sqlStatement, 1); 
     contactInfo.country = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,2)]; 
     contactInfo.state = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,3)]; 
     /*contactInfo.county = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,4)]; 
     contactInfo.town = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,5)]; 
     contactInfo.policeContact = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,6)]; 
     contactInfo.policeReport = sqlite3_column_int(sqlStatement, 7); 
     contactInfo.autopsyNumber = sqlite3_column_int(sqlStatement, 8); 
     contactInfo.lastSeen = sqlite3_column_int(sqlStatement, 9); 
     contactInfo.victimName = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,10)]; */ 
     [contactArray addObject:contactInfo]; 
    } 
} 
@catch (NSException *exception) { 
    NSLog(@"An exception occured: %@", [exception reason]); 
} 
@finally { 
    return contactArray; 
} 
} 

@end 

ありがとうございます!

+0

ドキュメントディレクトリにデータベースをコピーして使用する必要があります。 – Hector

+1

これについての回答は見つかりましたか? – Signcodeindie

答えて

0

あなたは次のようになります「DB」の宣言は、逃している:あなたのコードが続行されますので

if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK)) 

:私もこれで明快問題を見ることができます

sqlite3 *db; 

をあなたがエラーをキャッチしようとする部分の後ろに戻ってこないので、問題が見つかったときでも、それを評価することができます。

実行のご注文は、ほとんど次のようになります。

if (sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK) 
{   
    const char *sql = "SELECT * FROM table"; 
    sqlite3_stmt *statement;   
    if (sqlite3_prepare_v2(db, sql, -1, &statement, NULL) == SQLITE_OK) 
    { 
     while (sqlite3_step(statement) == SQLITE_ROW) { /* do stuff here */ } 
    } 
} 
+0

申し訳ありませんが、dbがヘッダーファイルで定義されているはずです。 – jake

+0

それでは、 'sqlite3_prepare'で何が起こったのか少し詳しく説明しますので、お手伝いできます。 –

+0

sqlite3_prepareは、1またはSQLエラー/データベースが存在しない状態で終了します。私はデータベースに接続し、CONTACTテーブルから情報を取得するようにしています。 – jake

0

は、ビューまたは表を問い合わせますか?ビューから選択するときに同じ問題が発生しました。私はこれをテーブルに変更したときに機能しました。