2017-01-06 3 views
1

Я создал функцию для отображения данных json в хранилище sqlite с использованием sqlite.swift. Я получаю странное поведение, хотя с первого раза, когда я пытаюсь запустить вставку, я получаю сообщение «Нет такой таблицы». Но вставки отлично работают после этого начального броска. Мой код работает, создавая соединение с базой данных onload с использованием 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

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

Смежные вопросы