3

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

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

然而,这条线本身是行不通的,因为它需要被一个 try/catch 块包围。除非在方法或函数中定义,否则 Try/catch 块将不起作用,所以现在我们有了

public func connectToDB() {
    do {
        let path = NSSearchPathForDirectoriesInDomains(
            .DocumentDirectory, .UserDomainMask, true
            ).first!
        let db = try Connection("\(path)/db.sqlite3")
    }
    catch {
        print("error connecting to database")
    }
}

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

4

3 回答 3

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

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

于 2015-11-30T15:25:42.077 回答
2

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

如果你在函数内部初始化一个变量,我的理解是它随着函数而死。我在我的代码中这样做如下:

var db: FM 数据库?

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
    }

}

现在您将可以访问“db”作为类变量。希望有帮助。

于 2016-01-06T23:24:23.247 回答
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!
}
于 2018-11-30T12:52:39.767 回答