2011-06-30 35 views
1

我從自下而上開始學習15年Cold Fusion後的iPad開發。我對Ansi C和xCode感到滿意,但是我很難用SQLite進行下一步。帶Ansi C和xCode的SQLite

我已經用razorSQL構建了一個數據庫(Airports.sqlite),並將它安裝在main.c所在的目錄中,我也安裝了合併的sqlite3.h和sqlite3.h文件。

一切編譯OK,但我得到當我運行下面的消息...

錯誤從跑道爲了select語句選擇長按長度遞減限制5沒有這樣的表:跑道。

數據庫中肯定有Runways表。有人能讓我挺身而出嗎?下面的代碼:


#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "sqlite3.h" 
#include "weightbalance.h" 

sqlite3* db; 
int first_row; 

int select_callback(void *p_data, int num_fields, char **p_fields, char **p_col_names) { 

    int i; 
    int *p_rn = (int*)p_data; 

    if (first_row) { 
     first_row = 0; 

     for(i=0; i < num_fields; i++) { 
      printf("%20s", p_col_names[i]); 
     } 
     printf("\n"); 
     for(i=0; i< num_fields*20; i++) { 
      printf("="); 
     } 
     printf("\n"); 
    } 

    (*p_rn)++; 

    for(i=0; i < num_fields; i++) { 
     printf("%20s", p_fields[i]); 
    } 

    printf("\n"); 
    return 0; 
} 


void select_stmt(const char* stmt) { 
    char *errmsg; 
    int ret; 
    int nrecs = 0; 

    first_row = 1; 

    ret = sqlite3_exec(db, stmt, select_callback, &nrecs, &errmsg); 

    if(ret!=SQLITE_OK) { 
     printf("Error in select statement %s [%s].\n", stmt, errmsg); 
    } 
    else { 
     printf("\n %d records returned.\n", nrecs); 
    } 
} 

void sql_stmt(const char* stmt) { 
    char *errmsg; 
    int ret; 

    ret = sqlite3_exec(db, stmt, 0, 0, &errmsg); 

    if(ret != SQLITE_OK) { 
     printf("Error in statement: %s [%s].\n", stmt, errmsg); 
    } 
} 

int main() { 
    sqlite3_open("Airports.sqlite", &db); 

    if(db == 0) { 
     printf("Could not open database."); 
     return 1; 
    } 

    printf("\nSelecting Airports with the longest runways.\n\n"); 
    select_stmt("select Length from Runways order by Length desc limit 5"); 

    sqlite3_close(db); 
    return 0; 
} 
+0

保存後請看看你的問題,看看你是否可以閱讀 - 在這種情況下代碼需要格式化爲代碼 – Mark

回答

1

最有可能的,在主()打開文件「Airports.sqlite」是不是你認爲它是一個。沒有路徑信息,sqlite3_open()將只打開當前工作目錄中的文件。

作爲調試步驟,在sqlite3_open()語句之前添加「printf(getwd(NULL))」。然後你會知道你是打開你現有的數據庫還是隻創建一個缺少你的表的新的空的數據庫。

此外,由於您使用的是Xcode,因此您可以將路徑作爲命令行參數(argv)傳遞給數據庫。在Xcode 4中,選擇Product-> Edit Scheme。在「運行」部分中,添加「啓動時傳遞參數」的路徑。然後你可以將argv [1]傳遞給你的sqlite3_open()。

+0

謝謝。這看起來像這個問題。我正在慢慢整理出來。 – MonkeyBusiness