1

以下は私のコードです。ユーザーが入力したテキストフィールドから空港都市名クエリを使用してsqliteデータベースからデータを取得し、ラベルに表示されるICAO識別子を取得しようとしています。データベースがロードされているようですが、IBAction ボタンを選択してもクエリが実行されません。ここにリストすることはできませんが、クエリステートメントまたはデータベースに問題がある可能性があります。どんな助けでも大歓迎です。

私が受け取った最後のエラーは次のとおりです。

-(NSString*)filePath {
    NSArray*paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    return [[paths objectAtIndex:0]stringByAppendingPathComponent:@"mydatabase.sqlite"];
}

//open database
- (void)viewDidLoad{

    [self openDB];
}


-(void)openDB {

    if(sqlite3_open([[self filePath]UTF8String], &airportDB) !=SQLITE_OK) {
        sqlite3_close(airportDB);
        NSAssert(0, @"Databese failed to open");
        status.text = @"Database Failed to Open";
    }
    else if (sqlite3_open([[self filePath]UTF8String], &airportDB) ==SQLITE_OK) {//this line not really needed but was trying everything
        NSLog(@"database opened");          //test
        status.text = @"Database Opened";  //test
    }
}

- (IBAction)searchICAO:(id)sender
{
    //[self.delegate detailViewControllerDidFinish:self]; //for later use


    //Get airport name from the text field user enters
    NSString*sql = [NSString stringWithFormat:@"SELECT * FROM airports WHERE city=\"%@\"", [searchDB text]];

    const char *query_stmt = [sql UTF8String];

    sqlite3_stmt *statement;

    NSLog(@"%s 1st SQL error '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(airportDB), sqlite3_errcode(airportDB));  //Error Test

これは私が問題を抱えているように見えるところです...

    if (sqlite3_prepare_v2(airportDB, query_stmt, -1, &statement, NULL)==SQLITE_OK) {// Problem is from here, can't get past this point

        NSLog(@"%s 2nd SQL error '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(airportDB), sqlite3_errcode(airportDB));  //Error Test

        if (sqlite3_step(statement)==SQLITE_ROW) {

            status.text = @"";  //Clear the status line

            NSString *returnICAO = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)];
            status.text = returnICAO;  //Insert Airport ICAO letters from the database table 

        }

        sqlite3_finalize(statement);

        [super viewDidLoad];
    }
    sqlite3_close(airportDB);
}
4

1 に答える 1

0

何がうまくいかないのか正確にはわかりませんが、サードパーティのコードを使用して達成できない特定の目的がない限り、FMDB https://github.com/ccgus/fmdbの使用を検討する必要があります。 SQLite に直接アクセスする必要があると仮定します。私はそれをかなり使いましたが、それでうまくいきました。

DB を「クローズ」して、searchICAO: から [super viewDidLoad] を呼び出すのは少し奇妙です。これは意図的なものでしたか?これがあなたの問題の原因かもしれませんか?2 番目のクエリで、DB は閉じられますか?

于 2013-07-12T21:54:12.203 に答える