2012-11-24 25 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); 

查詢它自似乎工作,主要的問題是如何得到我從收集值「SELECT *」到另一個int或char參數,讓我可以使用它嗎?

我發現一些使用回調結構的例子,或者提到關於使用sqlite3_prepare_v2和step方法。

雖然我找不到任何一種方法,請幫忙!

+0

有提到[這裏]教程(HTTP://計算器.COM /問題/ 10363028 /如何使用的,SQLite的功能於Xcode中,故事板)。 – monex0

回答

5

使用sqlite3_exec,你必須將所有值從字符串轉換,你必須使用回調的void *指針或一些全局變量返回的數據:當使用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 ... 
} 

,你甲肝E要調用sqlite3_step在一個循環,直到它不會返回SQLITE_ROW了(當你希望只有一個記錄,你只能調用一次):

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方法時,我得到了一個EXC_BAD_ACCESS上的int rc = sqlite3_prepare_v2(db,「SELECT a,b,c FROM SQList/* WHERE ..) 我假設它是關於如何聲明但是有點卡在這裏 – user1842318

+0

適用於我寫一個*最小*程序,只是打開數據庫並調用sqlite3_prepare_v2;它也崩潰了嗎? –

+0

太好了!謝謝你的建議我現在想出了問題! 這很簡單,因爲沒有爲char sql_quer分配足夠的內存! – user1842318

0

開始使用「選擇」查詢和存儲您的字符,並在array.Create一個NSMutableArray的詮釋價值觀和存儲,你會從SELECT查詢。下面得到的值的值的代碼將幫助您

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