0

このプログラムがこのコードを実行して SQLite データベースに接続すると、パス テストを通過してデータベースが開き、SQL が実際のデータベースで機能します。次に、sqlite3_prepare ステートメントを実行しようとすると失敗します。コード 1 で終了します - SQL エラーまたはデータベースが見つかりません。その後、データベースから取得したデータを読み取ろうとするまで、プログラムを続行します。その後、SQL エラーまたは sqlite3_prepare ステートメントからのデータベース コードの欠落が返されたため、何も得られなかったため失敗しました。間違っているコードの部分を探しています/sqlite3_prepared ステートメントで成功するように修正できます。

#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

ありがとう!

4

2 に答える 2

0

CONTACT はビューですか、それともテーブルですか? ビューから選択するときに同じエラーが発生する同様の問題がありました。これをテーブルに変更すると、うまくいきました。

于 2012-09-27T15:09:41.607 に答える
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 */ }
    }
}
于 2012-04-23T03:06:52.113 に答える