2013-07-12 5 views
1

다음은 내 코드입니다. 사용자가 입력 한 텍스트 필드에서 공항 도시 이름 쿼리를 사용하여 sqlite 데이터베이스에서 데이터를 검색하고 레이블에 표시 할 ICAO 식별자를 검색하려고합니다. db가로드되고있는 것 같지만 IBAction 버튼을 선택하면 쿼리되지 않습니다. 내 쿼리 문이나 데이터베이스에 문제가있을 수 있다고 생각하지만, 여기에 나와 있지는 않습니다. 어떤 도움이라도 대단히 감사하겠습니다.내 sqlite 데이터베이스를 쿼리 할 수 ​​없습니다.

내가받은 마지막 오류는 다음과 같습니다 database3 [30351 : C07] - [의 ViewController searchICAO이 :] I가 보이는 곳 1 SQL 오류 '순서가 호출 라이브러리 루틴'(21)

-(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); 
} 

답변

0

을 문제가 될, 당신은 고려해야한다 FMDB https://github.com/ccgus/fmdb 사용 - 직접 SQLite로 이동해야한다고 가정합니다. 이자형. 나는 그것을 아주 많이 사용했고 그것을 성공적으로 잘 수행했다.

DB를 "닫고"[super viewDidLoad]를 searchICAO :에서 호출하는 것이 약간 이상합니다. 이게 신중 했니? 이것이 귀하의 문제의 근원이 될 것 같습니까? 두 번째 쿼리에서 DB가 닫힙니 까?

+0

[super viewDidLoad]가 실수로 올바른 장소에 배치되었지만 어느 쪽이든 문제가되지 않았습니다. 내가 게시 한 후에 나는 그것을 알아 차렸다. 귀하의 회신에 감사 드리며, 나는 FMDB를 점검하고 내가 무엇을 생각해 낼 수 있는지 알아볼 것입니다. – sandPitPilot

관련 문제