Things take time

[SWIFT] sqlite3, 폰 DB 라이브러리 FMDB사용하기 본문

iOS (기능)

[SWIFT] sqlite3, 폰 DB 라이브러리 FMDB사용하기

겸손할 겸 2017. 6. 23. 15:54

[FMDB]


https://github.com/ccgus/fmdb

sqlite의 기능을 Object-C로 만든 라이브러리다. 스위프트에서 사용하려면? 브릿징헤더를 만들어서 연결해주면 된다.


[FMDB import]


1) 프로젝트를 생성한다.


2) 프로젝트 단위로 클릭을 하면 보이는 General탭의 하단에 아래와 같은 Linked Frameworks and Libraries의 + 버튼을 누른다.



3) libsqlite3.tbd를 연결한다.



4) 화면 상단의 Source Control의 Clone...을 클릭한다.



5) 하단의 저장소 위치를 깃허브 주소를 넣는다.



6) 해당 깃허브에서 다운받을 소스 프로젝트의 이름과 위치를 지정한다.



7) 다운받은 프로젝트를 열어 src -> fmdb 폴더 자체를 원래 프로젝트에 옮긴다.


Copy items if needs는 선택, 해당 파일을 링크로 연결할 것인지.. 아니면 프로젝트에 복사해서 프로젝트에서만 수정, 적용이 되는 것으로 할 것인지에 대한 여부다.(create groups)



8) 브릿징 헤더를 위한 .h 파일을 생성한다.



9) 생성된 파일의 제일 하단의 아래의 문구를 넣는다.


#import "FMDB.h"


10) Build Setting탭에서 Swift Compiler - General에서 헤더를 연결해준다.



여기서 중요한 것은 헤더파일의 위치다. 프로젝트 안에 소스폴더 안에 넣었다면 위의 스샷대로지만..

그냥 프로젝트 안에 넣었다면 Bridging-Header.h로만 작성하면 된다.


11) 마지막으로 fmdb폴더를 프로젝트 안에 넣었다면 프로젝트 속성 중 Builds Phases를 열어 Compile Sources를 살펴보자.

거기에 import한 소스가 있어야한다. 없다면 +를 눌러 넣을 것, 의미는 컴파일할 때 사용하는 소스파일이 뭐냐는 것이다.




[구성]




시나리오는 이렇다.

어플이 실행되고 폰 DB(sqlite)에 원하는 DB가 있는지를 조회한다. 없다면 .db파일을 생성하고 있다면 그 db안에 원하는 테이블이 있는지를 검사한다. 테이블이 없다면 생성한다.

이름과 나이를 입력하고 저장버튼을 누르면 해당 데이터를 저장하고, 이름을 입력하고 찾기를 누르면 나이를 얻어온다. 그 결과는 결과 라벨에 표시한다.

import UIKit class ViewController: UIViewController { @IBOutlet weak var nameTextField: UITextField! @IBOutlet weak var ageTextField: UITextField! @IBOutlet weak var resultLabel: UILabel! var databasePath = String() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. // DB Check let fileMgr = FileManager.default // 파일 찾기, 유저 홈 위치 let dirPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) // Document 경로 let docsDir = dirPath[0] print(docsDir) // Document/contacts.db라는 경로(커스터마이징 db임) databasePath = docsDir.appending("/contacts.db") print(databasePath) if !fileMgr.fileExists(atPath: databasePath) { // DB 접속 let contactDB = FMDatabase(path: databasePath) if contactDB.open() { let sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACTS ( ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, AGE INTEGER )" if !contactDB.executeStatements(sql_stmt){ print("Error : contactDB execute Fail, \(contactDB.lastError())") } contactDB.close() } else { print("Error : contactDB open Fail, \(contactDB.lastError())") } } else { print("contactDB is exist") } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func saveBtnClicked(_ sender: UIButton) { // DB접속 let contactDB = FMDatabase(path: databasePath) if contactDB.open(){ print("[Save to DB Name : \(nameTextField.text!) Age : \(ageTextField.text!)") let insertSQL = "INSERT INTO CONTACTS (NAME, AGE) values ('\(nameTextField.text!)', '\(ageTextField.text!)')" print(insertSQL) let result = contactDB.executeUpdate(insertSQL, withArgumentsIn: []) if !result{ resultLabel.text = "Fail to add contact" print("Error : contactDB add Fail, \(contactDB.lastError())") } else { resultLabel.text = "Success to add contact" nameTextField.text = "" ageTextField.text = "" } } else { print("Error : contactDB open Fail, \(contactDB.lastError())") } } @IBAction func findBtnClicked(_ sender: UIButton) { // DB접속 let contactDB = FMDatabase(path: databasePath) if contactDB.open(){ print("[Find to DB Name : \(nameTextField.text!) Age : \(ageTextField.text!)") let selectSQL = "SELECT NAME, AGE FROM CONTACTS WHERE NAME = '\(nameTextField.text!)'" print(selectSQL) do { let result = try contactDB.executeQuery(selectSQL, values: []) if result.next(){ ageTextField.text = result.string(forColumn: "AGE") resultLabel.text = "\(result.string(forColumn: "NAME")!) find!" } else { nameTextField.text = "" ageTextField.text = "" resultLabel.text = "Record is not founded" } } catch { print("error") } } else { print("Error : contactDB open Fail, \(contactDB.lastError())") } } }

[결과]






소스 코드는 영어 해석만 하고, 디비를 조금이나마 해봤다면 이해하기 쉬울 것이다.