프로그래밍/Object-C2012. 3. 18. 15:14
1. SQLite3 사용하기

프로젝트를 만듭니다.


Frameworks 폴더에 libsqlite3.dylib 라이브러리를 추가합니다.


ViewController.h


ViewController.m



2. 데이터베이스 생성하기 열기

필수 라이브러리를 추가하면 SQLite3에 포함된 여러 가지 C 함수들을 사용.

ViewController.h


ViewController.m



3. 테이블 생성하기

email과 name이라는 두 개의 필드를 갖는 Contacts라는 이름의 테이블을 생성.

ViewController.h


VoewController.m

데이터베이스를 생성하는 데 에러가 발생한다면, 애플리케이션을 중지하기 위해서 NSAssert 메서드를 사용하며 데이트베이스 연결을 끊음.


4. 레코드 삽입하기

ViewController.h


ViewController.m



5. 레코드 가져오기

ViewController.h


ViewController.m

 테이블에서 레코드를 가져오기 위해서는 먼저 SQL문을 준비한 다음, prepared문을 실행하기 위해서 sqlite3_step() 함수를 사용. sqlite3_step() 함수는 다른 열이 준비되면 100(SQLITE_ROW 상수를 나타내는)의 값을 반환.
 열에서의 첫 번째 필드에 대한 값을 가져오기 위해서 sqlite3_tmt 객체뿐만 아니라 가져오려고 하는 필드의 인덱스를 sqlite3_column_text() 함수에 전달.


6. 확인하기

ViewController.m




결과화면



Posted by 건깡

댓글을 달아 주세요

  1. 곱게자란녀석

    안녕하세요 ^^
    블로그에 정리해주신 자료로 열심히 공부 하고 있는 한 학생입니다.
    질문 한가지 드려도 될까요..?

    제가 이미 작성되어있는 sql 파일을 가져오려고 하는데요...

    - (void)viewDidLoad
    {
    [self openDB];
    [self getAllRowsFromTableNamed:@"PhoneNumber"];
    sqlite3_close(db);

    [super viewDidLoad];
    // Do any additional setup after loading the view.
    }

    뷰 디드 로드엔 이렇게 되어 있구요.
    오픈 디비와 겟 올 로우즈 메소드는 알려주신것과 동일하게 작성 하였어요.
    파일 패스의 경우를 조금 달리 줘봤는데...

    -(NSString *) filePath{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    NSString *readingDBPath = [documentsDir stringByAppendingPathComponent:@"PhoneNumber.sql"];

    NSFileManager *fileManager = [NSFileManager defaultManager];

    if(![fileManager fileExistsAtPath:documentsDir]){
    NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"PhoneNumber" ofType:@"sql"];
    if(defaultStorePath){
    [fileManager copyItemAtPath:defaultStorePath toPath:readingDBPath error:NULL];
    }
    }
    return readingDBPath;
    }

    요렇게 해놓고 똑같이 돌리니 아무것도 실행이 안되네요...
    서포트 파일즈 폴더에 PhoneNumber.sql 파일이 저장되어 있구요.
    그걸 띄워주게 하고싶은데

    디버깅 해보니
    if(sqlite3_prepare(db, [qsql UTF8String], -1, &statement, nil) == SQLITE_OK)
    이 if 문 안으로 들어가지질 않더군요.
    sqlite3 *db 변수는 openDB에서 filePath 메소드 호출해서 연결시켰구요.

    qsql 엔 쿼리문이 들어가있고. 실행하면 될것 같은데, 안되네요.. ㅠ

    긴글 읽어주셔서 감사해요 !

    2012.04.22 21:13 [ ADDR : EDIT/ DEL : REPLY ]
    • filePath 문제는 아닌거 같네요.

      저 소스만 보고는

      문제점을 모르겠네요.

      2012.04.23 10:36 신고 [ ADDR : EDIT/ DEL ]
  2. 나그네

    정말 감사합니다 은인이십니다 ㅠㅠ

    2012.05.21 21:10 [ ADDR : EDIT/ DEL : REPLY ]