list – 如何在swift中将回调函数传递给sqlite3_exec?
发布时间:2020-12-14 04:57:23 所属栏目:百科 来源:网络整理
导读:如何在 Swift中将回调函数传递给sqlite3_exec? sqlite_str = sqlite_str + "(sqlite_property_str))";var str:NSString = sqlite_str;var sqlite:COpaquePointer = share().sqlite3_db;var errmsg:UnsafePointerInt8 = nillet rc = sqlite3_exec(sqlite,st
如何在
Swift中将回调函数传递给sqlite3_exec?
sqlite_str = sqlite_str + "(sqlite_property_str))"; var str:NSString = sqlite_str; var sqlite:COpaquePointer = share().sqlite3_db; var errmsg:UnsafePointer<Int8> = nil let rc = sqlite3_exec(sqlite,str.cStringUsingEncoding(NSUTF8StringEncoding),<#callback: CFunctionPointer<((UnsafePointer<()>,Int32,UnsafePointer<UnsafePointer<Int8>>,UnsafePointer<UnsafePointer<Int8>>) -> Int32)>#>,<#UnsafePointer<()>#>,<#errmsg: UnsafePointer<UnsafePointer<Int8>>#>) 解决方法
Swift 2.2提供了两个用于实现sqlite3_exec回调函数的选项:(1)全局非实例func过程或(2)非捕获文字{}闭包.
sqlite.org的“SQLite in 5 minutes or less”示例在Swift Xcode7项目here中实现. 可读的类型 typealias sqlite3 = COpaquePointer typealias CCharHandle = UnsafeMutablePointer<UnsafeMutablePointer<CChar>> typealias CCharPointer = UnsafeMutablePointer<CChar> typealias CVoidPointer = UnsafeMutablePointer<Void> 回调方法 func callback( resultVoidPointer: CVoidPointer,// void *NotUsed columnCount: CInt,// int argc values: CCharHandle,// char **argv columns: CCharHandle // char **azColName ) -> CInt { for i in 0 ..< Int(columnCount) { guard let value = String.fromCString(values[i]) else { continue } guard let column = String.fromCString(columns[i]) else { continue } print("(column) = (value)") } return 0 // status ok } func sqlQueryCallbackBasic(argc: Int,argv: [String]) -> Int { var db: sqlite3 = nil var zErrMsg:CCharPointer = nil var rc: Int32 = 0 // result code if argc != 3 { print(String(format: "ERROR: Usage: %s DATABASE SQL-STATEMENT",argv[0])) return 1 } rc = sqlite3_open(argv[1],&db) if rc != 0 { print("ERROR: sqlite3_open " + String.fromCString(sqlite3_errmsg(db))! ?? "" ) sqlite3_close(db) return 1 } rc = sqlite3_exec(db,argv[2],callback,nil,&zErrMsg) if rc != SQLITE_OK { print("ERROR: sqlite3_exec " + String.fromCString(zErrMsg)! ?? "") sqlite3_free(zErrMsg) } sqlite3_close(db) return 0 } 关闭方法 func sqlQueryClosureBasic(argc argc: Int,argv: [String]) -> Int { var db: sqlite3 = nil var zErrMsg:CCharPointer = nil var rc: Int32 = 0 if argc != 3 { print(String(format: "ERROR: Usage: %s DATABASE SQL-STATEMENT",&db) if rc != 0 { print("ERROR: sqlite3_open " + String.fromCString(sqlite3_errmsg(db))! ?? "" ) sqlite3_close(db) return 1 } rc = sqlite3_exec( db,// database argv[2],// statement { // callback: non-capturing closure resultVoidPointer,columnCount,values,columns in for i in 0 ..< Int(columnCount) { guard let value = String.fromCString(values[i]) else { continue } guard let column = String.fromCString(columns[i]) else { continue } print("(column) = (value)") } return 0 },&zErrMsg ) if rc != SQLITE_OK { let errorMsg = String.fromCString(zErrMsg)! ?? "" print("ERROR: sqlite3_exec (errorMsg)") sqlite3_free(zErrMsg) } sqlite3_close(db) return 0 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |