Ios 如何在Swift中全局声明数据库连接变量
我需要初始化一个变量以连接到Swift中的SQLite数据库。我正在使用库,需要通过以下线路连接到数据库:Ios 如何在Swift中全局声明数据库连接变量,ios,swift,sqlite.swift,Ios,Swift,Sqlite.swift,我需要初始化一个变量以连接到Swift中的SQLite数据库。我正在使用库,需要通过以下线路连接到数据库: let db = try Connection("path/to/db.sqlite3") 但是,该行本身无法工作,因为它需要被try/catch块包围。除非在方法或函数中定义Try/catch块,否则Try/catch块将不起作用,所以现在我们有了 public func connectToDB() { do { let path = NSSearchPathF
let db = try Connection("path/to/db.sqlite3")
但是,该行本身无法工作,因为它需要被try/catch块包围。除非在方法或函数中定义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声明还需要初始化,因此这意味着它不能全局设置。如何从类中的其他方法访问此对象?您可以执行以下操作:
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
或者你可以这样做:
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
你可以在闭包中做任何你想做的事情来处理错误案例。我不确定上面的答案为什么是正确的-从最初的问题来看,他有两个问题,一个是使用Try/Catch,另一个是变量的范围 如果在函数内部初始化一个变量,我的理解是它会随函数一起消失。我在我的代码中这样做,如下所示: VarDB:FMDB数据库
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”。希望有帮助。如果使用包装器
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!
}
除此之外,请特别阅读有关
范围的部分
;创建一个数据库管理器对象,并在应用程序周围传递对该对象的引用。你会发现测试你的应用程序要容易得多。好的,我来做。非常感谢。你可以从评论中找到你的答案并加上这句话。我的声誉太低,无法评论别人。还是我误解了?