2017-01-06 2 views
1

sqlite.swift를 사용하여 json 데이터를 sqlite 저장소에 매핑하는 함수를 만들었습니다. 처음에는 삽입을 실행하려고 시도한 이후로 "이상한 테이블"오류가 발생했기 때문에 이상한 동작이 나타납니다.하지만 삽입이 처음 throw 된 후 완벽하게 작동합니다. 코드는 SQLData를 사용하여 데이터베이스 onload에 연결하여 작동합니다. .instance.connect는(). 그런 다음 호출이 삽입 할 때마다 그것이이 데이터 내에서 모든 열이 설정되어 있는지 확인하기 위해 테이블을 초기화 배치됩니다.Sqlite.swift 해당 테이블 오류가 없습니다.

// 버튼에 부착

let userJSON = JSON(["user_id" : id, "username" : email]) 

SQLData.instance.insert(table: "users", data: userJSON) { result in 
     if let result = result{ 
       print(result) 
     } 
} 

// SQL 클래스

class SQLData { 
    static let instance = SQLData() 
    var db: Connection? = nil 

    func connect() { 
     let path = NSSearchPathForDirectoriesInDomains(
      .documentDirectory, .userDomainMask, true 
      ).first! 
     do { 
      self.db = try Connection("\(path)/contacts.sqlite3") 
      if let db = self.db { 
       try db.run(Table("users").drop(ifExists: true)) 
      } 
      print("SQLite connection established.") 
     } catch { 
      print("Couldn't create SQLite connection.") 
     } 
    } 

    func initTable(table: String, data: JSON, completionHandler: (Table?) -> Void){ 
     if let db = db { 
      let t = Table(table) 

      do { 
       try db.run(t.create(temporary: false, ifNotExists: true) { r in 
        r.column(Expression<Int>("id"), primaryKey: true) 
        r.column(Expression<Bool>("synced"), defaultValue: false) 

        for (key,val) in data { 
         if val.bool != nil{ 
          r.column(Expression<Bool>(key), defaultValue: false) 
         } else if val.int != nil { 
          r.column(Expression<Int>(key), defaultValue: 0) 
         } else if val.double != nil { 
          r.column(Expression<Double>(key), defaultValue: 0.0) 
         } else { 
          r.column(Expression<String?>(key), defaultValue: "") 
         } 
        } 
        completionHandler(t) 
       }) 
      } catch let err { 
       print(err) 
       completionHandler(nil) 
      } 
     } else { 
      completionHandler(nil) 
     } 
    } 

    func insert(table: String, data: JSON, completionHandler: @escaping (Int64?) -> Void){ 
     self.initTable(table: table, data: data) { t in 
      if let db = db, let t = t { 
       var query: [Setter] = [] 
       for (key, val) in data { 
        if val.bool != nil{ 
         query.append(Expression<Bool>(key) <- val.boolValue) 
        } else if val.int != nil { 
         query.append(Expression<Int>(key) <- val.intValue) 
        } else if val.double != nil { 
         query.append(Expression<Double>(key) <- val.doubleValue) 
        } else { 
         query.append(Expression<String?>(key) <- val.stringValue) 
        } 
       } 
       do { 
        try db.transaction { 
         let insert = t.insert(query) 
         let rowid = try db.run(insert) 
         completionHandler(rowid) 
        } 
       } catch let err { 
        print(err) 
        completionHandler(nil) 
       } 
      } else { 
       completionHandler(nil) 
      } 
     } 
    } 
} 

답변

0

연결 변경

func connect(){ 
    do { 
     let databaseFilePath = Bundle.main.path(forResource: "contacts", ofType: "sqlite3")! 
     db = try Connection(databaseFilePath) 
    } catch { 
     print(error) 
    } 
} 

및 BU 확인하십시오 .sqlite3 (또는 파일 .db) 아래와 같이 이온 기능 프로젝트 계층 구조에 파일 및 이미지처럼 번들 자원을 복사

enter image description here

enter image description here

관련 문제