gpt4 book ai didi

ios - 将 sqlite3_exec 回调函数的结果保存到 Swift 中的字典中

转载 作者:行者123 更新时间:2023-11-29 05:42:21 37 4
gpt4 key购买 nike

我想创建一个执行sqlite3_exec 并将结果保存到作为参数传递的字典对象中的函数。为此,我创建了以下代码:

func execute(sql: String, result: inout Dictionary<String, String>) {
let rc = sqlite3_exec(
dbPointer, // database
sql, // statement
{ // callback: non-capturing closure
resultVoidPointer, columnCount, values, columns in

for i in 0 ..< Int(columnCount) {
let value = String(cString: values![i]!)
let column = String(cString: columns![i]!)
result[column] = value // Error: Escaping closures can only capture inout parameters explicitly by value
print("\(column) = \(value)")
}
return 0
},
nil,
nil
)

if rc != SQLITE_OK {
print("SQLite Error: " + errorMessage)
}
}

但是这段代码给了我以下错误:转义闭包只能通过值显式捕获 inout 参数。另一种尝试是让函数execute 返回一个字典对象,但错误消息变为:A C 函数指针无法从捕获上下文的闭包形成。我该如何解决这个问题?

最佳答案

已关注 Shawn的评论,我创建了一个新版本的 execute,其中使用 sqlite3_prepare_v2sqlite3_stepsqlite3_finalize 而不是组合函数sqlite3_exec:

func prepare(sql: String) -> OpaquePointer? {
var statement: OpaquePointer? = nil
guard sqlite3_prepare_v2(dbPointer, sql, -1, &statement, nil) == SQLITE_OK else {
print(errorMessage)
return nil
}
return statement
}


func execute(sql: String) -> [Dictionary<String, String>] {
var result: [Dictionary<String, String>] = []

guard let queryStatement = prepare(sql: sql) else {
return result
}

defer {
sqlite3_finalize(queryStatement)
}

while sqlite3_step(queryStatement) == SQLITE_ROW {
var dictionary: Dictionary<String, String> = [:]

for i in 0...sqlite3_column_count(queryStatement)-1 {
let column: String = String(cString: sqlite3_column_name(queryStatement, i))
let value: String = String(cString: sqlite3_column_text(queryStatement, i))
dictionary[column] = value
}

result.append(dictionary)
}

guard sqlite3_step(queryStatement) == SQLITE_DONE else {
print(errorMessage)
return result
}

return result
}

我的 execute 函数现在返回一个字典数组,其中每个字典代表 SELECT 等 SQL 语句的一行。对于其他 SQL 语句(例如 INSERT、UPDATE 或 DELETE),不会返回任何行,函数 execute 返回一个空数组。

执行SQL语句后,可以通过以下方式访问结果

let result = execute(db, "SELECT id, name, age FROM Table")
print(result[i][age]) // prints the value in row i and column age

关于ios - 将 sqlite3_exec 回调函数的结果保存到 Swift 中的字典中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56444063/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com