2012-06-25 19 views
3

我是xcode/iOS/Objective-C和sqlite的新手。我試圖教自己的基礎 - 我想使用sqlite3包裝「sqlite3_exec」爲選擇查詢。出於某種原因,我無法找到某個人做這件事的簡單示例。如何在iOS 5.1上將回調函數傳遞給sqlite3_exec?

基本上,該方法具有用於回調函數的參數(第三個):

int sqlite3_exec(
    sqlite3*,         /* An open database */ 
    const char *sql,       /* SQL to be evaluated */ 
    int (*callback)(void*,int,char**,char**), /* Callback function */ 
    void *,         /* 1st argument to callback */ 
    char **errmsg        /* Error msg written here */ 
); 

這很好。我對回調並不陌生。不過,我似乎無法得到正確的語法。我接手的視圖控制器之一,在我的iPad(iOS版5.1)的Xcode(4.3)項目,並取得了如下的修改:

#import "SecondViewController.h" 
#import "sqlite3.h" 
#import "AppState.h" 

@interface SecondViewController() 

@end 

@implementation SecondViewController 

- (int)myCallback:(void *)a_parm argc:(int)argc argv:(char **)argv column:(char **)column 
{ 

    return 0; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    //grab questionnaire names 
    char *sql = "select * from QST2Main order by [Name]"; 
    char *err = nil; 
    sqlite3 *db = [[AppState sharedManager] getgCn]; 

    sqlite3_exec(db, sql, myCallback, nil, &err); 
} 

從本質上講,我想運行一個查詢時,這一觀點首次加載,以存儲一些數據供以後使用。但是,XCode不喜歡那裏底部的「myCallback」用法。它說: 未聲明使用標識符'myCallback'。

該方法在頭文件中聲明,我甚至嘗試過使它靜態。似乎沒有任何東西讓這個錯誤消失。我知道我必須在這裏做一些根本性的錯誤,但在我的生活中,我無法弄清楚什麼 - 我甚至無法在這個領域找到其他代碼示例,這可以幫助我找出我錯過的東西。

非常感謝!

回答

6

回調需要是C函數。嘗試

int myCallback(void *a_parm, int argc, char **argv, char **column) 
{ 
    return 0; 
} 
+0

是的,工作!非常感謝,這讓我瘋狂!這被認爲適合在同一個類中混合使用C語言和Objective-C語法嗎?就像我說的,我是這個特定領域的新手。 –

+2

@JohnDoh如果你想實現在Objective-C的回調方法的核心: 1.傳遞對象作爲第四個參數: sqlite3_exec(DB,SQL,myCallBack函數,(__bridge無效*)自我,&err); 例如,如果您保留Objective-C -myCallback:argc:argv:column方法,請嘗試使用 int myCallback(void * a_parm,int argc,char ** argv的,字符**列) { 回報[(__bridge SecondViewController *)a_param myCallBack函數:a_parm的argc:ARGC ARGV:argv的列:列];} ! –

+0

非常好,謝謝你這麼多 –

相關問題