IOS July 03, 2018

iOS Swift4 환경에서 sqlite3 DB 사용하기

Words count 5k Reading time 5 mins. Read count 0

Sqlite3를 이용하여 CRUD 구현하기

Serverless한 앱을 주로 만들면 데이터를 로컬에 저장하게 되는데, 주로 UserDefault를 사용합니다. 데이터가 단순하고 양이 많지 않다면 상관없지만 CRUD 횟수가 많고 데이터 양이 많다면
Database 를 사용하는게 바람직합니다.

iOS Swift4환경에서 Sqlite3를 이용해서 데이터 CRUD를 구현하는 과정을 설명합니다.

import Sqlite3

import UIKit
import SQLite3

class WorkingTimeDBManager: NSObject {

}

근무시간을 관리하는 데이터를 저장하는 앱을 제작중입니다. 근무시간을 저장하기 위한 역할을 하는 WorkingTimeDBManager를 구현합니다.
import SQLite3 로 해당 파일에서 SQLite3 모듈을 사용할 수 있도록 선언합니다.

WorkingTime 모델은

id : Primary 키
start : 근무 시작 시간
end : 근무 종료 시간

로 구성할 예정입니다.

CRUD

가장 기본이 되는 CRUD 메소드를 선언합니다.

    private func createWorkingTime(start: NSDate, end: NSDate) {
        ...
    }

    private func updateWorkingTime(id: Int, start: NSDate, end: NSDate) {
        ....
    }

    private func readWorkingTimes(start: NSDate, end: NSDate) {
        ...
    }

    private func deleteWorkingTime(id: Int) {
        ...
    }

CRUD - Create

private func createWorkingTime(start: NSDate, end: NSDate) {
        var insertStatement: OpaquePointer? = nil
        let insertStatementString = "INSERT INTO WorkingTimes (start, end) VALUES (?, ?);"

        if sqlite3_prepare_v2(db, insertStatementString, -1, &insertStatement, nil) == SQLITE_OK {

            sqlite3_bind_int(insertStatement, 1, Int32(start.timeIntervalSince1970))
            sqlite3_bind_int(insertStatement, 2, Int32(end.timeIntervalSince1970))

            if sqlite3_step(insertStatement) == SQLITE_DONE {
                // Success
            } else {
                // Fail
            }
        } else {
            //Fail
        }
        // 4
        sqlite3_finalize(insertStatement)
    }

근무시간을 저장하는 메소드입니다. 근무시작시간과 종료 시간을 받아서 WorkingTimes 테이블에 start, end 컬럼에 데이터를 추가합니다. id 컬럼은 테이블 선언시 AUTOINCREMENT로 선언했습니다.

CRUD - Read

private func readWorkingTimes(start: NSDate, end: NSDate) {
        let queryStatementString = "SELECT * FROM WorkingTimes;"
        var queryStatement: OpaquePointer? = nil

        if sqlite3_prepare_v2(db, queryStatementString, -1, &queryStatement, nil) == SQLITE_OK {

            while sqlite3_step(queryStatement) == SQLITE_ROW {

                let id = sqlite3_column_int(queryStatement, 0)

                let queryResultCol1 = sqlite3_column_int(queryStatement, 1)
                let queryResultCol2 = sqlite3_column_int(queryStatement, 2)

                print("\(id) | \(queryResultCol1) | \(queryResultCol2)")

            }
        } else {
            // Fail
        }

        sqlite3_finalize(queryStatement)
    }

WorkingTimes 테이블의 모든 ROW를 읽어옵니다. while 문을 통해 읽어온 모든 ROW 에 대해 처리합니다.

CRUD - Update

private func updateWorkingTime(id: Int, start: NSDate, end: NSDate) {
        let updateStatementString = "UPDATE WorkingTimes SET start = " +
            String(start.timeIntervalSince1970) +
            ", end = " +
            String(end.timeIntervalSince1970) +
        " WHERE id = " + String(id)

        var updateStatement: OpaquePointer? = nil
        if sqlite3_prepare_v2(db, updateStatementString, -1, &updateStatement, nil) == SQLITE_OK {
            if sqlite3_step(updateStatement) == SQLITE_DONE {
                // Success
            } else {
                // Fail
            }
        } else {
            // Fail
        }
        sqlite3_finalize(updateStatement)
    }

id에 해당하는 ROW 를 찾아서 start와 end column을 갱신합니다.

CRUD - Delete

private func deleteWorkingTime(id: Int) {
        let deleteStatementStirng = "DELETE FROM WorkingTimes WHERE id = " + String(id)
        var deleteStatement: OpaquePointer? = nil

        if sqlite3_prepare_v2(db, deleteStatementStirng, -1, &deleteStatement, nil) == SQLITE_OK {
            if sqlite3_step(deleteStatement) == SQLITE_DONE {
                // Success
            } else {
                // Fail
            }
        } else {
            // Fail
        }

        sqlite3_finalize(deleteStatement)
    }

WorkingTimes 테이블에서 전달인자로 넘어온 id 에 해당하는 ROW 를 제거합니다.

0%