Swift에서 FMDB 사용

5410 단어 SwiftFMDBsqlite

소개



Swift에서 퀴즈 앱을 만들 때 문제 관리를 SQLite로 수행하기 위해 Objective-C 시대에 이용한 라이브러리 FMDB를 사용하기로 했다.

환경



사용한 것



Xcode 6.3.1
iOS 8.3
[FMDB Ver2.5][1]
[Lita][2]

소개



첫째, 프로젝트를 만든 후



FMDB를 DL



fmdb를 프로젝트를 여는 Xcode로 드래그 앤 드롭



Create groups를 선택하여 추가

다음으로 NewFile→Hedder File을 선택



파일 이름
プロジェクト名-Bridging-Header.h

작성

파일을 열면



이렇게되어 있기 때문에 FMDB를 가져옵니다.


#import "FMDatabase.h"
#import "FMResultSet.h"
#import "FMDatabaseAdditions.h"
#import "FMDatabaseQueue.h"
#import "FMDatabasePool.h"

타겟
Build Setting → Swift Compiler - Code Generation → Objective-C Bridging Header

를 선택하여 다음을 위해 설명
プロジェクト名/プロジェクト名-Bridging-Header.h



이제 사용할 수 있어야합니다.

사용법



터미널에서 db 만들기
sqlite3 データベース名


sqlite> .schema

.schema를 입력하면 파일이 생성되므로

Lita에서 열고 테이블 추가

데이터 입력을 마친 db를 프로젝트로 드래그 앤 드롭



아래 코드에서 빌드 후 Documents 폴더에 db가 없으면 복사하려고합니다.
setSqlite()를 ViewDidLoad 등으로 호출해 준다
    func setPath()->(String){
        // /Documentsまでのパスを取得
        let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask, true)
        // <Application>/Documents/test.db というパスを生成
        let _path = paths[0].stringByAppendingPathComponent("test.db")
        return _path
    }

    func setSqlite(){
        if NSFileManager.defaultManager().fileExistsAtPath(setPath()) == false {
            //ファイルがない場合はコピー
            let defaltDBPath :String = NSBundle.mainBundle().pathForResource("test.db", ofType:nil)!
            NSFileManager.defaultManager().copyItemAtPath(defaltDBPath, toPath: setPath(), error: nil)

            if NSFileManager.defaultManager().fileExistsAtPath(setPath()) == false {
                //error
                println("Copy error = " + defaltDBPath)
            }
        }else{
            println("DB file OK")
        }
    }

sql을 아래와 같이 기술해 값을 취득했습니다.
let db = FMDatabase(path: setPath())
let quiz_sql = "SELECT * FROM quiz_tb where id = \(qNum);"
db.open() 
let quiz_results = db.executeQuery(quiz_sql, withArgumentsInArray: nil)

while quiz_results.next() {
      // カラム名を指定して値を取得する方法
      question = quiz_results.stringForColumn("question") //questionにStringでquestionを代入
      answer = quiz_results.stringForColumn("answer")
      commentary = quiz_results.stringForColumn("commentary")
}
db.close()

문제점



이 설명이라면 대형 데이터를 편집하여 프로젝트에 덮어 쓰면
이미 실제 기계와 에뮬레이터에 db가 있기 때문에 복사되지 않습니다.
일단 앱을 제거한 다음 다시 빌드해야합니다.

해결책으로


NSFileManager.defaultManager().removeItemAtPath(setPath(), error: nil)
let defaltDBPath :String = NSBundle.mainBundle().pathForResource("test.db", ofType:nil)!
NSFileManager.defaultManager().copyItemAtPath(defaltDBPath, toPath: setPath(), error: nil)

파일이 있는지 없는지의 판정으로, 있으면 Remove하고 나서 추가하도록(듯이) 기술하는 것으로 해결했습니다.

기타 Sql을 작성하는 방법



[여기][3]의 기사를 참고로 받을 수 있으면 좋다고 생각합니다.

[1]: htps : // 기주 b. m/cc s/fmdb
[2] : h tp // w w. 그럼 ts. 이 m/d 루파 l/? q=이므로/58
[3] : htp : ///bぉ기오 s. s ck3. 네 t/아 r ゔぇ s/2610

좋은 웹페이지 즐겨찾기