【问题标题】:How do I pass a callback function to sqlite3_exec on iOS 5.1?如何在 iOS 5.1 上将回调函数传递给 sqlite3_exec?
【发布时间】:2012-06-27 04:30:08
【问题描述】:

我是 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 */
);

没关系。我对回调并不陌生。但是,我似乎无法正确理解语法。我接管了我的 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”。

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

非常感谢!

【问题讨论】:

    标签: objective-c ios xcode sqlite


    【解决方案1】:

    回调必须是 C 函数。试试

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

    【讨论】:

    • 是的,成功了!非常感谢,这让我发疯了!这被认为适合在同一类中混合 C 和 Objective-C 语法吗?就像我说的,我是这个特定领域的新手。
    • @JohnDoh 如果您想在 Objective-C 中实现回调方法的核心: 1. 将对象作为第四个参数传递: sqlite3_exec(db, sql, myCallback, (__bridge void *)self , &呃); 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]; }
    • @TammoFreese 非常感谢!我认为您应该在答案中的评论中添加代码,这才是真正帮助我的事情!
    猜你喜欢
    • 2013-06-06
    • 2023-02-09
    • 1970-01-01
    • 2013-02-07
    • 2022-08-02
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多