2012-03-13 2 views
0

두 개의 열이 조합 (텍스트), 플래그 (숫자)로 구성된 테이블이 있습니다. 선택 쿼리에서 where 절을 사용하여 조합 값에 따라 플래그 값을 검색하려고합니다.데이터베이스에서 특정 데이터를 가져 오는 데 어려움이 있습니다.

조합 값이 1에서 시작될 때 문제가 발생합니다. 여기서 조합 = '1001'이면 테이블에서 플래그의 올바른 값을 검색하지만 0에서 시작하는 경우 여기서 조합 = '0010'이면 데이터베이스에서 아무 것도 검색되지 않습니다. 코드를 디버깅했는데 이유가 없습니다. 다음은 데이터베이스 이미지입니다.

This is table having two columns.

-(void)fetchfromDatabase 
{ 
     sqlite3 *database; 

NSString *strPath = [[NSBundle mainBundle]pathForResource:@"ken" ofType:@"db"]; 
NSLog(@"DBPath : %@",strPath); 

const char *dbPath = [strPath UTF8String]; 

if(sqlite3_open(dbPath, &database)==SQLITE_OK) 
{ 
    NSLog(@"Database is Ok"); 

    // const char *cConcate = [concate UTF8String]; 
    NSString *query = [NSString stringWithFormat:@"select * from kentable where combination =%@",concate]; 
    NSLog(@"final concate in database:%@",concate); 
    NSLog(@"Query:%@",query); 
    const char *sqlQuery =[query cStringUsingEncoding:NSASCIIStringEncoding]; 
    NSLog(@"char query %s", sqlQuery); 
    sqlite3_stmt *queryStatement; 

    if(sqlite3_prepare_v2(database, sqlQuery,-1,&queryStatement, NULL)==SQLITE_OK) 
    { 
     NSLog(@"Conversion is Ok"); 


     while (sqlite3_step(queryStatement)==SQLITE_ROW) 
     { 
      NSLog(@"in While Statement of row"); 
      int flag=sqlite3_column_int(queryStatement, 1); 

      NSLog(@"question 5:%d",flag); 
     } 
     sqlite3_reset(queryStatement); 
    } 
    else 
    { 
     NSLog(@"ERROR"); 
    } 

    sqlite3_close(database); 

} 

}

+1

귀하의 검색어에 따옴표를 추가 할 수 있습니다. CoreData와 함께 sqlite를 사용하는 것을 선호하지만. – govi

+0

핵심 데이터 사용! 길은 빠르며 관리 할 코드가 적습니다. 당신은 선택 진술을 작성하지 않을 것입니다. –

+0

@ govi 당신 말이 맞습니다. 많이 감사합니다. 괜찮 았어. –

답변

1

또한 작업의 종류를 데 .. 그것이 잘 작동 것 ... 그냥

있는 NSString으로 코드를 변경 * 데이터 = [자기 상태 : 콤비네이션];

-(NSString *) status:(NSString *)concate 
    { 
    databasePath = [[NSString alloc] initWithString: [[NSBundle mainBundle] pathForResource:@"ken" ofType:@"db"]]; 
     sqlite3_stmt *statement; 
     NSString *aName; 
     const char *dbpath = [databasePath UTF8String]; 

     if (sqlite3_open(dbpath, &database) == SQLITE_OK) 
     { 
      NSString *querySQL = [NSString stringWithFormat: 
            @"SELECT combination, flag FROM details WHERE combination =\"%@\"", 
            concate]; 

      const char *query_stmt = [querySQL UTF8String]; 
      sqlite3_prepare_v2(database, 
           query_stmt, -1, &statement, NULL); 
      if (sqlite3_step(statement) == SQLITE_ROW) 
      { 
       // Read the data from the result row 
       aName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; 

       NSLog(@"same %@" ,aName) ; 

      } 
      else 
      { 
       aName=nil; 
      } 

    sqlite3_finalize(statement); 
      sqlite3_close(database); 

     } 


[databasePath release]; 
    return aName; 
} 
3

다음과 같이 코드를 변경하십시오. 신경 쓰지 마라. 그렇지만 SQL 쿼리를 준비하는 것은 표준적인 방법을 따르는 것이 바람직하지 않다. sqlite3_bind_text 함수를 사용하여 문자열을 바인딩 할 수 있습니다.

if(sqlite3_open(dbPath, &database)==SQLITE_OK) 
{ 
    const char *sqlQuery = "select * from kentable where combination = ?"; 
    sqlite3_stmt *queryStatement; 

    if(sqlite3_prepare_v2(database, sqlQuery,-1,&queryStatement, NULL)==SQLITE_OK) 
    { 
     NSLog(@"Conversion is Ok"); 
     sqlite3_bind_text(insertStmt,1, [concate UTF8String], -1, SQLITE_TRANSIENT);  

     while (sqlite3_step(queryStatement)==SQLITE_ROW) 
     { 
      NSLog(@"in While Statement of row"); 
      int flag=sqlite3_column_int(queryStatement, 1); 

      NSLog(@"question 5:%d",flag); 
     } 
     sqlite3_reset(queryStatement); 
    } 
    else 
    { 
     NSLog(@"ERROR"); 
    } 
    sqlite3_close(database); 
} 
+0

도움이 되었습니까? ? –

관련 문제