2012-11-24 5 views
4

xcode 및 cocos2dx를 사용하여 SQlite DB에서 여러 값을 가져 오는 것과 관련하여 네트워크에서 작동하는 예제를 찾는 데 큰 어려움을 겪고 있습니다. 여기에 내가 가진 SQL 쿼리입니다 :SQlite 쿼리 - 여러 열 데이터를 검색하려면 어떻게합니까?

char sql_query[100]; 
sprintf(sql_query, "SELECT * FROM SQList WHERE ColumnD BETWEEN %d AND %d ORDER BY RANDOM() LIMIT 1", MinColumnD, MaxColumnD); 

자기 보인다 쿼리 작동하려면, 주요 문제는 내가로부터 수집 한 값을 얻을 어떻게 다른 INT 또는 문자 매개 변수에 '* 선택'입니다 그래서 그것을 사용할 수 있습니까?

일부 예제에서는 구조체에 대한 콜백을 사용하거나 sqlite3_prepare_v2 및 단계 메서드 사용에 대해 언급 한 것으로 나타났습니다.

두 가지 방법 중 하나의 예를 찾을 수 없지만 도와주세요!

+0

은 [여기]를 언급 튜토리얼 (HTTP 있습니다 : // 유래 .com/questions/10363028/how-to-use-sqlite-in-xcode-storyboard). – monex0

답변

5
를 쿼리를 "선택"하고 문자를 저장하고있는 NSMutableArray array.Create의 값을 int로하고 다음 SELECT 쿼리 국지적에서 얻을 것이다 값을 저장하여 값을 도움이 될 것입니다하기 당신이 근래, sqlite3_prepare*를 사용하는 경우

struct MyData { 
    string A; 
    int B, C; 
}; 

int exec_callback(void *ptr, int argc, char *argv[], char *names[]) 
{ 
    vector<MyData> *list = reinterpret_cast<vector<MyData> *>(ptr); 
    MyData d; 
    d.A = argv[0] ? argv[0] : ""; 
    d.B = atoi(argv[1]); 
    d.C = atoi(argv[2]); 
    list->push_back(d); 
    return 0; 
} 

void query_with_exec() 
{ 
    vector<MyData> list; 

    char *errmsg = NULL; 
    sqlite3_exec(db, "SELECT a, b, c FROM SQList /* WHERE ... */", 
       exec_callback, &list, &errmsg); 
    if (errmsg) { 
     printf("error: %s!\n", errmsg); 
     return; 
    } 

    // use list ... 
} 

:

sqlite3_exec를 사용하여, 당신은 문자열에서 모든 값을 변환해야합니다, 당신은 데이터를 반환하는 콜백의 void * 포인터 또는 일부 전역 변수를 사용해야합니다 그것은 더 이상 SQLITE_ROW을 반환하지 않습니다 (당신은 단지 하나 개의 레코드를 예상 할 때, 당신은 한 번만 호출 할 수 있습니다)까지 전자는 루프에서 sqlite3_step를 호출 :

void query_with_step() 
{ 
    vector<MyData> list; 
    sqlite3_stmt *stmt; 

    int rc = sqlite3_prepare_v2(db, "SELECT a, b, c FROM SQList /* WHERE ... */", 
           -1, &stmt, NULL); 
    if (rc != SQLITE_OK) { 
     printf("error: %s!\n", sqlite3_errmsg(db)); 
     return; 
    } 

    for (;;) { 
     rc = sqlite3_step(stmt); 
     if (rc == SQLITE_DONE) 
      break; 
     if (rc != SQLITE_ROW) { 
      printf("error: %s!\n", sqlite3_errmsg(db)); 
      break; 
     } 

     MyData d; 
     const char *text = (const char *)sqlite3_column_text(stmt, 0); 
     d.A = text ? text : ""; 
     d.B = sqlite3_column_int(stmt, 1); 
     d.C = sqlite3_column_int(stmt, 2); 
     list.push_back(d); 
    } 

    sqlite3_finalize(stmt); 

    // use list ...  
} 
+0

나는이 방향이 내가 C++에있는 cocos2dx를 사용함에 따라 더 필요하다고 생각한다. 나는 여전히 문제에 직면하고있다 ... sqlite3_exec 메서드에서 EXC_BAD_ACCESS를 콜백리스트에서 얻는다 .-> push_back (d); 섹션. prepare_v2 메서드를 사용할 때 int rc = sqlite3_prepare_v2 (db, "SELECT a, b, c FROM SQList/* WHERE ..)에 EXC_BAD_ACCESS가 나타납니다. 내가 선언 한 방식과 관련이 있다고 가정하고 있습니다. 그저 조금 붙어 있습니다 ... – user1842318

+0

나를 위해 일합니다. * DB를 열고'sqlite3_prepare_v2'를 호출하는 * minimal * 프로그램을 작성하십시오; 역시 충돌합니까? –

+0

좋습니다! 지금 당장 문제를 해결해 주셔서 감사합니다! char sql_quer에 충분한 메모리를 할당하지 않는 것이 간단합니다! – user1842318

0

코드는 당신에게

-(int)find_putts_count:(int)holeno{ 
    sqlite3 *database; 
NSString *databasePath; 
NSMUtableArray *arr_tracking_details = [[NSMUtableArray alloc] init]; 
int putts = -1; 
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDir = [documentPaths objectAtIndex:0]; 
databasePath = [documentsDir stringByAppendingPathComponent:@"GolfElite.sqlite"]; 
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
{ 
    // Setup the SQL Statement and compile it for faster access 
    NSString *sqlStatement = nil; 
      sqlStatement = [NSString stringWithFormat:@"select Putts from Holes WHERE HoleNo == %d and ShotNo == %d and PlayerId == '%@'",holeno,1,[arr_players_id objectAtIndex:scorecard_player_no]]; 
    sqlite3_stmt *compiledStatement; 
    if(sqlite3_prepare_v2(database, [sqlStatement UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK) 
    { 
     if(sqlite3_step(compiledStatement) == SQLITE_ROW) 
     { 
      [arr_tracking_details addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)]]; 
      [arr_tracking_details addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement,6)]]; 
      [arr_tracking_details addObject:[NSString stringWithFormat:@"%d",(int)sqlite3_column_int(compiledStatement, 4)]]; 

      putts = (int)sqlite3_column_int(compiledStatement, 0); 
     } 
    } 
    sqlite3_finalize(compiledStatement); 
} 
sqlite3_close(database); 
return putts; 
} 
관련 문제