Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 8. SQLite DBMS를 iOS에서 사용방법 (기본), 브리지 헤더 사용방법 본문

iOS 실전 (swift)/데이터베이스

[iOS - swift] 8. SQLite DBMS를 iOS에서 사용방법 (기본), 브리지 헤더 사용방법

jake-kim 2020. 5. 9. 21:13

1. 라이브러리 세팅

1) libsqlite3.tbd 

2) sqlite3는 c,c++로 되어있으므로 브리지 헤더로 임포트 해야함

추가 -> Header File -> 이름 입력후 저장

 

3) 브리지 헤더 추가

target -> Build Settings -> All, Combined탭 선택

-> swift Compiler - General -> Objective-C Bridging Header에 아까 추가한 파일의 디렉토리명 복붙

4) 만든 브리지 헤더 파일에 sqlite3.h임포트

2. DB연결과 테이블 생성

1) DB와 연관된 필수 객체 2개 정의 (OpaquePointer자료형)

 - DB와 연결하는 객체

 - SQL문자열이 컴파일 정보가 저장될 stmt


2) DB가 저장될 디렉토리 생성

 - 파일을 문서디렉토리(documentDirectory)에 저장하는 이유 : 일반성 (iCloud를 사용할 때도 백업 대상이 되는 디렉토리)

 * NSString을 사용했을시, 위와 같은 코드

let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString
let dbPath = path.strings(byAppendingPaths: ["db.sqlite"])[0]

3) SQL문 작성


4) 5단계 (DB Connection ~ close connection)

sqlite3_open(dbPath, &db) /// DB connection
sqlite3_prepare(db, sql, -1, &stmt, nil) /// get SQL be compiled - stmt
sqlite3_step(stmt) /// excute SQL
sqlite3_finalize(stmt) /// unlock stmt in DB
sqlite3_close(db) /// close DB connection

위 5단계를 다음과 같이 작성

 

* 리펙토링

- defer블록 사용 : 함수안에서 return을 만나기 전에 defer블록을 만나게 되면, return 종료 전에 defer블록을 역순(가장 최근에 만난 defer블록)부터 실행한 후 종료되는 것

 (코드상 끝(밑)에있는 defer블록먼저 실행)

 (중첩 defer블록인 경우는 내부 defer블록먼저 실행 후 외부 defer블록 실행)

        /// 필수로 필요한 객체 : 각각 DB와 연결할 객체와, 컴파일 된 SQL문을 담을 객체
        var db: OpaquePointer? = nil /// SQLite 연결 정보를 담을 객체
        guard sqlite3_open(dbPath, &db) == SQLITE_OK else {return}
        
        defer {
            print("Close DB Connection")
            sqlite3_close(db)
        }
        
        var stmt: OpaquePointer? = nil
        let sql = "CREATE TABLE IF NOT EXISTS sequence (num INTEGER)"
        guard sqlite3_prepare(db, sql, -1, &stmt, nil) == SQLITE_OK else {return}

        defer {
            print("Finalize Statement")
            sqlite3_finalize(stmt)
        }
        
        if sqlite3_step(stmt) == SQLITE_DONE {print("Success the Crete Table")}
    }

5) DB 확인

/// db확인 :  terminal열어서 open [밑주소]
print("dir = \n\(dbPath)")

 

Comments