2012-04-23 50 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

是接触的视图或表?从视图中选择时,我遇到了类似的问题。当我将其更改为表格时,它工作正常。