2012-06-25 5 views
3

저는 xcode/iOS/Objective-C와 sqlite를 처음 사용합니다. 나는 스스로에게 기본을 가르치려고 노력하고 있으며 select 쿼리를 위해 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 */ 
); 

:

기본적으로,이 방법은 콜백 함수의 파라미터 (세번째)을 갖는다. 나는 콜백을 낯선 사람이 아니다. 그러나 구문을 올바르게 이해하지 못하는 것 같습니다. 내 아이 패드 (아이폰 OS 5.1) 엑스 코드 (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 구문을 혼합하는 것이 적절하다고 생각합니까? 내가 말했듯이, 나는이 특별한 지역에 처음 온 사람이다. 1 패스 네 번째 매개 변수로 개체 : 당신이 목표 - C의 콜백 메소드의 핵심 구현하려는 경우 –

+2

@JohnDoh sqlite3_exec (DB, SQL, myCallback (__bridge 무효 *) 자체를 &err); 2. C 콜백 호출을 Objective-C 객체의 메소드로 만듭니다. 예를 들어 Objective-C -myCallback : argc : argv : column 메소드를 계속 사용하는 경우 int myCallback (void * a_parm, int argc, char ** argv를, 문자 ** 열) { 반환 [(__bridge SecondViewController *) a_param을 myCallback :를 argv를 열 :는 argc를 ARGV :는 argc를 a_parm 칼럼] }! –

+0

우수, 정말 감사합니다 –

관련 문제