如何在Swift中全局声明数据库连接变量

时间:2015-11-30 15:13:46

标签: ios swift sqlite.swift

我需要初始化一个变量以连接到Swift中的SQLite数据库。我正在使用SQLite.swift库,需要使用以下行连接到数据库:

      Dim Query2 As String
         For i As Integer = Me.DataGridView1.SelectedRows.Count - 1 To 0 Step -1
            Dim Query2 As String
            Query2 = "Update booklist SET quantity=(quantity-1) where quantity = '" & Me.DataGridView1.SelectedRows(i).Cells(0).Value.ToString() & "'"
            COMMAND = New MySqlCommand(Query2, MysqlConn)
            SDA.SelectCommand = COMMAND
            SDA.Fill(dbDataSet)
            bSource.DataSource = dbDataSet
            DataGridView1.DataSource = bSource
            SDA.Update(dbDataSet)

但是,这行本身不起作用,因为它需要用try / catch块包围。除非在方法或函数中定义了try / catch块,否则它们将无法工作,所以现在我们已经

let db = try Connection("path/to/db.sqlite3")

但是,这不允许我从同一文件中的其他方法访问变量,这是我需要做的。全局let声明也需要初始化,这意味着它不能全局设置。如何从类中的其他方法访问此对象?

3 个答案:

答案 0 :(得分:6)

你可以这样做:

let db = try! Connection("path/to/db.sqlite3")
// db is a Connection but the app dies if there was an error.

或者你可以这样做:

let db = try? Connection("path/to/db.sqlite3")
// db is an Optional<Connection> and nil if there was an error.

或者你可以这样做:

let db = { () -> Connection in
    do {
        return try Connection("path/to/db.sqlite3")
    } catch {
        do {
            return try Connection() // transient in-memory database
        } catch {
            fatalError()
        }
    }
}() // invoke this closure immediately

你可以在闭包中做任何你喜欢的事情来处理错误案例。

答案 1 :(得分:2)

我不确定为什么上面的答案是正确的 - 从最初的问题来看,他似乎有两个问题,一个是使用Try / Catch,另一个是SCOPE OF VARIABLE。

如果您正在初始化函数内部的变量,我的理解是它会随函数而死。我在我的代码中执行如下操作:

var db:FMDatabase?

func openDB() -> FMDatabase {
    do {
        let path = NSSearchPathForDirectoriesInDomains(
            .DocumentDirectory, .UserDomainMask, true
            ).first!
        let db = try Connection("\(path)/db.sqlite3")
        return db
    }
    catch {
        print("error connecting to database")
        return nil
    }

}

现在您可以访问&#34; db&#34;作为类变量。希望有所帮助。

答案 2 :(得分:0)

如果使用包装器SQLite.swift,则代码可能如下所示:

var db: Connection?

func openDB() -> Connection {
    //Simply return if the connection already exists
    if db == nil {
        do { let path = NSSearchPathForDirectoriesInDomains(
            .documentDirectory, .userDomainMask, true
            ).first!
            db = try Connection("\(path)/database.sqlite3")
            print("Database opened")
            print(path)
        }
        catch {
            print("error connecting to database \(error)")
            print("In func openDB() -> Connection")
        }
    }
    return db!
}