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 를 제거합니다.