애플리케이션을 설계할 때 가장 중요한 요소 중 하나는 바로 데이터를 어떻게 저장하느냐입니다. 데이터를 저장하는 방법은 다양하지만, 그중에서도 널리 사용되는 것이 바로 SQLite 데이터베이스입니다.
SQLite는 C 프로그래밍 라이브러리 형태로 제공되는 관계형 데이터베이스 관리 시스템(RDBMS)으로, 애플리케이션 내부에 임베드되어 동작하기 때문에 모바일 환경에서 특히 유용합니다.
iPhone에서 SQLite 데이터베이스에 접근하는 방법은 여러 가지가 있지만, 이번 튜토리얼에서는 Swift를 활용한 가장 간단하고 쉬운 방법을 소개하겠습니다.
이 튜토리얼에서 만들 샘플 앱은 이름을 입력받는 텍스트 필드와 두 개의 버튼을 가지고 있으며, 입력한 이름을 SQLite 데이터베이스에 저장한 후 '보기' 버튼을 누르면 저장된 데이터를 출력해 줍니다.
그럼 시작해 보겠습니다!
Step 1 – Xcode 프로젝트 생성
Xcode를 열고 → Single View Application → 프로젝트 이름을 DBSqlite로 지정합니다.
Step 2 – UI 구성하기
Main.storyboard를 열어 아래 이미지처럼 텍스트 필드 한 개와 버튼 두 개를 배치합니다.
Step 3 – IBOutlet과 IBAction 연결하기
버튼 두 개에는 @IBAction을, 텍스트 필드에는 @IBOutlet을 생성하고 각각 btnInsert, btnShowData, name이라고 이름을 지정합니다.

지금까지 데이터를 삽입할 버튼과 조회할 버튼을 추가했고, 데이터베이스에 저장할 이름을 입력할 텍스트 필드도 만들었습니다.
Step 4 – SQLite 파일 생성 및 데이터베이스 연결 열기
이제 SQLite 파일을 생성하고 데이터베이스 연결을 열어 보겠습니다.
ViewController.swift 상단에 다음 코드를 작성하여 SQLite3 라이브러리를 임포트합니다.
import SQLite3
ViewDidLoad 아래에 아래 코드를 작성하면 .sqlite 파일이 생성되며, 해당 파일이 저장된 경로를 출력할 수 있습니다. 여기서는 이름만 저장할 예정이므로 파일명을 "user_name.sqlite"로 지정했습니다.
let file_URL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("user_name.sqlite")다음으로 sqlite3_open() 함수를 사용해 데이터베이스를 엽니다.
데이터베이스 작업에 사용할 OpaquePointer 타입의 객체를 생성합니다. 이 변수는 ViewDidLoad 위쪽에 전역 변수로 선언합니다.
var db: OpaquePointer?
Step 5 – 테이블 생성하기
이제 테이블을 생성합니다. viewDidLoad 메서드 안에 아래 코드를 작성하세요.
//creating table
if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)", nil, nil, nil) != SQLITE_OK {
let errorMsg = String(cString: sqlite3_errmsg(db)!)
print("There's error creating the table: \(errorMsg)")
}Step 5까지 완료하면 최종 코드는 아래와 같아야 합니다.
import UIKit
import SQLite3
class ViewController: UIViewController {
var db: OpaquePointer?
@IBOutlet var name: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let file_URL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
.appendingPathComponent("user_name.sqlite")
print (file_url) //to print the path of sqlite.
//opening the database
if sqlite3_open(file_URL.path, &db) != SQLITE_OK {
print("There's error in opening the database")
}
//create table
if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)", nil, nil, nil) != SQLITE_OK {
let errorMsg = String(cString: sqlite3_errmsg(db)!)
print("There's error creating the table: \(errorMsg)")
}
}
@IBAction func btnInsert(_ sender: Any) {
}
@IBAction func btnShowData(_ sender: Any) {
}
}위 코드를 실행했을 때 오류가 없다면 성공입니다. 안내된 위치로 이동해 sqlite 파일이 실제로 생성되었는지 확인해 보세요.
Step 6 – 데이터 삽입 코드 작성하기
이제 데이터를 삽입하는 코드를 작성합니다. btnInsert 메서드에 아래 코드를 작성하세요.
var statement: OpaquePointer?
guard let user_name = name.text, !user_name.isEmpty else {
return
}
let query = "INSERT INTO users (name) VALUES (?)"
if sqlite3_prepare(db, query, -1, &statement, nil) != SQLITE_OK {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("error preparing insert: \(errmsg)")
return
}
if sqlite3_bind_text(statement, 1, user_name, -1, nil) != SQLITE_OK {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("failure binding name: \(errmsg)")
return
}
if sqlite3_step(statement) != SQLITE_DONE {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("failure inserting users: \(errmsg)")
return이 코드는 텍스트 필드에 입력된 값을 테이블에 단순히 기록하는 역할을 합니다.
Step 7 – 저장된 데이터 조회하기
이제 저장된 데이터를 화면에 표시해야겠죠? btnShowData 메서드에 아래 코드를 작성합니다.
let query = "SELECT * FROM users"
var statement:OpaquePointer?
if sqlite3_prepare(db, query, -1, &statement, nil) != SQLITE_OK {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("error preparing insert: \(errmsg)")
return
}
while(sqlite3_step(statement) == SQLITE_ROW) {
let name = String(cString: sqlite3_column_text(statement, 1))
print(name)
}완성된 전체 코드는 아래와 같습니다.
import UIKit
import SQLite3
class ViewController: UIViewController {
var db: OpaquePointer?
@IBOutlet var name: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let file_URL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
.appendingPathComponent("user_name.sqlite")
//opening the database
if sqlite3_open(file_URL.path, &db) != SQLITE_OK {
print("There's error in opening the database")
}
//creating table
if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)", nil, nil, nil) != SQLITE_OK {
let errorMsg = String(cString: sqlite3_errmsg(db)!)
print("There's error creating the table: \(errorMsg)")
}
}
@IBAction func btnInsert(_ sender: Any) {
var statement: OpaquePointer?
guard let user_name = name.text, !user_name.isEmpty else {
return
}
let query = "INSERT INTO users (name) VALUES (?)"
if sqlite3_prepare(db, query, -1, &statement, nil) != SQLITE_OK {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("error preparing insert: \(errmsg)")
return
}
if sqlite3_bind_text(statement, 1, user_name, -1, nil) != SQLITE_OK {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("failure binding name: \(errmsg)")
return
}
if sqlite3_step(statement) != SQLITE_DONE {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("failure inserting users: \(errmsg)")
return
}
}
@IBAction func btnShowData(_ sender: Any) {
let query = "SELECT * FROM users"
var statement:OpaquePointer?
if sqlite3_prepare(db, query, -1, &statement, nil) != SQLITE_OK {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("error preparing insert: \(errmsg)")
return
}
while(sqlite3_step(statement) == SQLITE_ROW) {
let name = String(cString: sqlite3_column_text(statement, 1))
print(name)
}
}
}실행 결과 확인하기
이제 코드를 실행하고 텍스트 필드에 HELLO라고 입력한 뒤 Insert 버튼을 눌러보세요. 이어서 Show 버튼을 누르면 Xcode 디버거 영역의 출력창에 HELLO가 출력되는 것을 확인할 수 있습니다.

