如何在
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 }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。