加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读