IOS에서 DB를 사용하는 방법은 Sqlite 와 Realm이 있다.
Realm은 속도가 빠르고, 높은 용량을 요구하여 대용량 데이터를 다룰 때 사용하는 방법이다.
Sqlite는 그 반대로 내장된 라이브러리라서 가볍게 사용하기 좋다.
Swift로 간단히 데이터를 저장하기 위해 Sqlite의 사용법을 알아보도록 한다.
1. Swift에 sqlite import를 해준다.
import SQLite3
2. 변수 및 테이블 명 (전역 변수로 선언해 준다.)
var db:OpaquePointer?
let TABLE_NAME : String = "DaDaTable"
2. Table 생성
func createTable(){
let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("DSDatabase.sqlite")
if sqlite3_open(fileURL.path, &db) != SQLITE_OK {
print("table not exsist")
}
let CREATE_QUERY_TEXT : String = "CREATE TABLE IF NOT EXISTS \(TABLE_NAME) (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, subline, date TEXT)"
print(CREATE_QUERY_TEXT)
if sqlite3_exec(db, CREATE_QUERY_TEXT, nil, nil, nil) != SQLITE_OK {
let errMsg = String(cString:sqlite3_errmsg(db))
print("db table create error : \(errMsg)")
}
}
3. 데이터 삽입
func insert(_ title : String,_ subline : String, _ date : String ){
var stmt : OpaquePointer?
let INSERT_QUERY_TEXT : String = "INSERT INTO \(TABLE_NAME) (title, subline, date) Values (?,?,?)"
if sqlite3_prepare(db, INSERT_QUERY_TEXT, -1, &stmt, nil) != SQLITE_OK {
let errMsg = String(cString: sqlite3_errmsg(db)!)
print("error preparing insert:v1 \(errMsg)")
return
}
let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
if sqlite3_bind_text(stmt, 1, title, -1, SQLITE_TRANSIENT) != SQLITE_OK{
let errMsg = String(cString : sqlite3_errmsg(db)!)
print("failture binding name: \(errMsg)")
return
}
if sqlite3_bind_text(stmt, 2, subline, -1, SQLITE_TRANSIENT) != SQLITE_OK{
let errMsg = String(cString : sqlite3_errmsg(db)!)
print("failture binding name: \(errMsg)")
return
}
if sqlite3_bind_text(stmt, 3, date, -1, SQLITE_TRANSIENT) != SQLITE_OK{
let errMsg = String(cString : sqlite3_errmsg(db)!)
print("failture binding name: \(errMsg)")
return
}
if sqlite3_step(stmt) != SQLITE_DONE {
let errMsg = String(cString : sqlite3_errmsg(db)!)
print("insert fail :: \(errMsg)")
return
}
}
4. 데이터 검색
func selectValue(){
let SELECT_QUERY = "SELECT * FROM \(TABLE_NAME)"
var stmt:OpaquePointer?
if sqlite3_prepare(db, SELECT_QUERY, -1, &stmt, nil) != SQLITE_OK{
let errMsg = String(cString: sqlite3_errmsg(db)!)
print("error preparing insert: v1\(errMsg)")
return
}
while(sqlite3_step(stmt) == SQLITE_ROW){
let id = sqlite3_column_int(stmt, 0)
let title = String(cString: sqlite3_column_text(stmt, 1))
let subline = String(cString: sqlite3_column_text(stmt, 2))
let date = String(cString: sqlite3_column_text(stmt, 3))
print("read value id : \(id) title : \(title) subline : \(subline) date : \(date)")
}
}
5. 업데이트
func update(_ index:String, _ title : String,_ subline : String, _ date : String){
let UPDATE_QUERY = "UPDATE \(TABLE_NAME) Set title = '\(title)', subline = '\(subline)', date= '\(date)' WHERE id == \(index)"
var stmt:OpaquePointer?
print(UPDATE_QUERY)
if sqlite3_prepare(db, UPDATE_QUERY, -1, &stmt, nil) != SQLITE_OK{
let errMsg = String(cString: sqlite3_errmsg(db)!)
print("error preparing update: v1\(errMsg)")
return
}
if sqlite3_step(stmt) != SQLITE_DONE {
let errMsg = String(cString : sqlite3_errmsg(db)!)
print("update fail :: \(errMsg)")
return
}
sqlite3_finalize(stmt)
print("update success")
}
6. 데이터 삭제
func delete(_ index:String){
// readValues()
let DELETE_QUERY = "DELETE FROM \(TABLE_NAME) WHERE id = \(index)"
var stmt:OpaquePointer?
print(DELETE_QUERY)
if sqlite3_prepare_v2(db, DELETE_QUERY, -1, &stmt, nil) != SQLITE_OK{
let errMsg = String(cString: sqlite3_errmsg(db)!)
print("error preparing delete: v1\(errMsg)")
return
}
if sqlite3_step(stmt) != SQLITE_DONE {
let errMsg = String(cString : sqlite3_errmsg(db)!)
print("delete fail :: \(errMsg)")
return
}
sqlite3_finalize(stmt)
}
간단히 데이터를 저장하기 위해선 sqlite가 적합하다.
대용량 데이터를 처리하기 위해선 Realm을 사용하는데 이 후 정리하는 시간을 갖도록 하겠다.
'swift' 카테고리의 다른 글
[swift] Cocoapads import 에러 (0) | 2021.05.10 |
---|---|
[Swift] FireBase 연동 (0) | 2021.05.10 |
[swift] 통신 시 인터넷 권한 추가 (info.plist 설정하기) (0) | 2021.05.07 |
[Swift] Objective-C 연동하기(bridging header) (0) | 2021.05.04 |
[Swift] Struct와 Class 정리 (0) | 2021.04.26 |