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'。
該方法在頭文件中聲明,我甚至嘗試過使它靜態。似乎沒有任何東西讓這個錯誤消失。我知道我必須在這裏做一些根本性的錯誤,但在我的生活中,我無法弄清楚什麼 - 我甚至無法在這個領域找到其他代碼示例,這可以幫助我找出我錯過的東西。
非常感謝!
是的,工作!非常感謝,這讓我瘋狂!這被認爲適合在同一個類中混合使用C語言和Objective-C語法嗎?就像我說的,我是這個特定領域的新手。 –
@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的列:列];} ! –
非常好,謝謝你這麼多 –