2012-04-23 122 views
0

當此程序運行此代碼以連接到SQLite數據庫時,它可以通過路徑測試,打開數據庫,SQL在實際數據庫上工作。然後,當它嘗試執行sqlite3_prepare語句時失敗。它退出代碼1 - SQL錯誤或缺少數據庫。然後它會一路繼續執行程序,直到它試圖讀取它從數據庫中獲得的數據。然後它失敗了,因爲它從來沒有得到任何東西,因爲它返回了SQL錯誤或sqlite3_prepare語句中缺少數據庫代碼。我正在尋找錯誤的代碼部分/我可以更正它使sqlite3_prepared語句成功。sqlite3_prepare()的問題目標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 2012-04-23 04:01:04

+1

你有沒有找到答案呢? – Signcodeindie 2012-08-03 03:33:06

回答

0

你錯過了「DB」的聲明,這將如下所示:

sqlite3 *db; 

我還可以看到一個清晰的問題與此:

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

由於您的代碼將繼續即使在發現問題時也要評估內容,因爲您不會在您嘗試捕獲錯誤的那些部分之後返回。

你的執行順序應該看起來有點像這樣:

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 2012-04-23 03:19:28

+0

那麼再對'sqlite3_prepare'中發生的事情做一點更具體的描述,以便我們可以幫助你。 – 2012-04-23 04:06:05

+0

sqlite3_prepare以1或SQL錯誤/缺失數據庫退出。我試圖讓它連接到數據庫並從CONTACT表中提取信息。 – jake 2012-04-23 04:21:20

0

是接觸的視圖或表?從視圖中選擇時,我遇到了類似的問題。當我將其更改爲表格時,它工作正常。