2017-01-06 1 views
1

sqlite.swiftを使用してjsonデータをsqliteストアにマッピングする関数を作成しました。私は奇妙な動作を受信して​​いますが、私は "私はそのようなテーブル"エラー "を取得するインサートを実行しようとして以来、しかし、インサートは完全に最初のスロー後に動作します。私のコードはSQLDataを使用してデータベースの負荷.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) 
    } 
} 

と府必ずご.sqlite3(または.DB)以下のようなイオン機能、プロジェクト階層にファイルや画像のようなバンドルリソースをコピー

enter image description here

enter image description here

関連する問題