我需要初始化一个变量以连接到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声明也需要初始化,这意味着它不能全局设置。如何从类中的其他方法访问此对象?
答案 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!
}