如何在iOS 5.1上将回调函数传递给sqlite3_exec?

Joh*_*Doh 3 sqlite xcode objective-c ios

我是xcode/iOS/Objective-C和sqlite的新手.我正在尝试自学基础知识 - 我想使用sqlite3包装器"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 */
);
Run Code Online (Sandbox Code Playgroud)

没关系.我对回调并不陌生.但是,我似乎无法正确地获得语法.我接管了我的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); 
}
Run Code Online (Sandbox Code Playgroud)

本质上,我想在首次加载此视图时运行查询,以存储一些数据供以后使用.但是,XCode不喜欢底部的"myCallback"用法.它说:未声明使用标识符'myCallback'.

该方法在头文件中声明,我甚至尝试将其设置为静态.似乎没有什么能让这个错误消失.我知道我必须在这里做一些根本错误的事情,但对于我的生活,我无法弄清楚是什么 - 我甚至无法在这个领域找到其他可以帮助我弄清楚我缺少的代码示例.

非常感谢!

Tam*_*ese 6

回调需要是C函数.尝试

int myCallback(void *a_parm, int argc, char **argv, char **column)
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • @JohnDoh如果你想在Objective-C中实现回调方法的核心:1.将对象作为第四个参数传递:sqlite3_exec(db,sql,myCallback,(__ bridge void*)self,&err); 2.使C回调调用Objective-C对象上的方法.例如,如果保留Objective-C -myCallback:argc:argv:column方法,请尝试int myCallback(void*a_parm,int argc,char**argv,char**column){return [(__bridge SecondViewController*)a_param myCallback:a_parm argc:argc argv:argv column:column]; } (2认同)