【问题标题】:Why saving data to SQLite database doesn't work with Swift 2?为什么将数据保存到 SQLite 数据库不适用于 Swift 2?
【发布时间】:2015-11-13 13:36:27
【问题描述】:

我正在使用SQLite.swift,我正在使用 SQLite.swift 演示中的这些代码。

import UIKit
import SQLite

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let db = try! Connection()
        let users = Table("users")
        let id = Expression<Int64>("id")
        let email = Expression<String>("email")
        let name = Expression<String?>("name")
        try! db.run(users.create { t in
            t.column(id, primaryKey: true)
            t.column(email, unique: true, check: email.like("%@%"))
            t.column(name)
        })
        try! db.run(users.insert(email <- "alice@mac.com"))
        for user in db.prepare(users) {
            print("id: \(user[id]), email: \(user[email])")
        }
    }
}

我第一次运行的时候,输出是:

("SELECT * FROM \"users\"", [])
id: 1, email: alice@mac.com

然后我删除第 17 行(try! db.run(users.insert(email &lt;- "alice@mac.com")))并再次运行,调试器输出更改为:

("SELECT * FROM \"users\"", [])

看起来alice@mac.com 没有保存到数据库。那我哪里做错了?或者如何保存到 SQLite 数据库中?

附:我正在使用 Xcode 7 beta 5、Swift 2.0

【问题讨论】:

  • 请检查数据库。该记录在数据库中可用吗?
  • 我不知道那个数据库在@iAshish的什么位置
  • 您已经在文档的目录路径中给出了存储数据库的路径,对吗? @大卫?
  • 只需在控制台中打印该路径即可。并使用查找器转到该数据库。在 sqlite 浏览器中打开该数据库并检查数据是否可用。
  • 但是如何打印呢? @iAshish

标签: database swift sqlite swift2 sqlite.swift


【解决方案1】:

viewDidLoad 首先创建表,然后插入。

当表已经存在时,我不知道表创建函数的行为,但如果它没有对您抛出任何错误,它可能会再次重新创建表。如果是这种情况,在调用 viewDidLoad 并注释掉插入后,您可能最终会得到一个全新的空白表。

尝试更改逻辑以确保不会每次都重新创建表。

【讨论】:

    【解决方案2】:
    let db = try! Connection()
    

    创建一个 in-memory 数据库,您可以从 API 文档中看到:

    /// Initializes a new SQLite connection.
    ///
    /// - Parameters:
    ///
    ///   - location: The location of the database. Creates a new database if it
    ///     doesn’t already exist (unless in read-only mode).
    ///
    ///     Default: `.InMemory`.
    ///
    ///   - readonly: Whether or not to open the database in a read-only state.
    ///
    ///     Default: `false`.
    ///
    /// - Returns: A new database connection.
    public init(_ location: Location = .InMemory, readonly: Bool = false) throws
    

    数据不会持久化到文件中,数据库始终是初始状态 空。

    对于持久数据库,使用

    /// Initializes a new connection to a database.
    ///
    /// - Parameters:
    ///
    ///   - filename: The location of the database. Creates a new database if
    ///     it doesn’t already exist (unless in read-only mode).
    ///
    ///   - readonly: Whether or not to open the database in a read-only state.
    ///
    ///     Default: `false`.
    ///
    /// - Throws: `Result.Error` iff a connection cannot be established.
    ///
    /// - Returns: A new database connection.
    public convenience init(_ filename: String, readonly: Bool = false) throws
    

    例如

    // Compute file path for database in Documents directory:
    let docsDir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
    let dbPath = (docsDir as NSString).stringByAppendingPathComponent("database.sqlite")
    
    do {
        let db = try Connection(dbPath)
        // ... use database
    
    } catch (error) {
        // Could not create or open database, print error
    }
    

    【讨论】:

      【解决方案3】:

      你可以有这样的东西(显然其他人都可以改进代码):

      1. 创建表格模型:

        class TUsers {
        static let TABLE_NAME : String = “users”
        static let ID = Expression<Int64>("id")
        static let EMAIL = Expression<String>(“email”)
        static let NAME = Expression<String>(“name”)
        
        class func addUser(email : String!, name : String!) -> Bool{
        
            let users = Table(TABLE_NAME)
        
            do {
        
                try DBHelper.instance.db.run(users.insert(
                    TUsers.EMAIL <- email,
                    TUsers.NAME <- name
                ))
        
                return true
            } catch {
                print("Insert failed")
                return false
            }
        }
        
        class func getAllUsers() -> [User] { // you must create the model user
            let users = Table(TUsers.TABLE_NAME)
        
            let query = users.select(*)
                //.filter(TUsers.EMAIL == “whatever@pomberobota.com”)
        
            var listOfUsers : [Users] = []
        
            for user in DBHelper.instance.db.prepare(query) {
                // Do whatever you need to instantiate the model User
        
        
                listOfUsers.append(User(email: users[TUsers.EMAIL], name: users[TUsers.NAME])
        
            }
        
            return listOfUsers
        }
        }
        
      2. 创建一个数据库助手

        class DBHelper {
        
        static let instance = DBHelper()
        
        var db : Connection
        
        init() {
            do {
                self.db = try Connection("\(Util.getDBPath())/db.sqlite3")
                createTablesIfNotExists()
            } catch {
                print("Could not create a connection to database")
            }
        }
        
        func createTablesIfNotExists() {
        
            let users = Table(TUsers.TABLE_NAME)
            do {
                try db.run(logs.create(ifNotExists: true) { t in
                        t.column(TUsers.ID, primaryKey: true)
                        t.column(TUsers.EMAIL)
                        t.column(TUsers.NAME)
                })
            } catch {
                print(“Could not create table users”)
            }
        }
        }
        
      3. 最后(这里你不需要导入 SQLite)。

        class ViewController: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
        
           TUsers.addUser(“user@ndetavysho.com”, “John Capuchon”)
        
            let users = TUsers.getAllUsers()
        
            for user in users {
                // do something
            }
        }
        

        }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-30
        • 2013-01-18
        • 2021-06-05
        相关资源
        最近更新 更多