如何调用sqlite3_open(通过引用传递不透明指针)

时间:2014-06-08 18:18:58

标签: sqlite swift

作为练习,我试图为sqlite3创建一个包装器。我已经设置了桥接标头,我可以看到sqlite3功能的工具提示,但我无法弄清楚如何拨打sqlite3_open

sqlite3.h包含sqlite3sqlite3_open的以下定义:

typedef struct sqlite3 sqlite3;

SQLITE_API int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

这意味着sqlite3_open将一个指向匿名结构的指针作为尾随参数,这在工具提示中看起来很清楚:

func sqlite3_open(filename: CString, ppDb: CMutablePointer<COpaquePointer>) -> CInt

知道CMutablePointer意味着传入&amp; T,我最接近的是:

class Database {
    var handle:COpaquePointer

    init(file:String) {
        let error = sqlite3_open(file as CString, &handle)
    }

    deinit {
        sqlite3_close(handle)
    }
}

sqlite3_close行没有错误,所以我认为我至少关闭了,但是sqlite3_open行产生了:

Cannot convert the expression's type 'CInt' to type '$T9'

有关如何执行此操作的任何线索?

请不要回答使用FMDB或其他基于Objective-C的界面。正如我所说,这至少部分是一个练习如何使用swift中的C库的练习。

2 个答案:

答案 0 :(得分:3)

问题不在于handle参数,而在于字符串转换。以下作品......

class Database {
    var handle: COpaquePointer = nil

    init(file: NSString) {
        let error = sqlite3_open(file.cStringUsingEncoding(NSUTF8StringEncoding), &handle)
    }
}

我不确定为什么'as CString'不起作用。

答案 1 :(得分:1)

当您将#import <sqlite3.h>添加到Bridging-Header时,sqlite3 C / C ++ API将被“翻译”为本机swift函数。因此,sqlite3_open将如下所示。

func sqlite3_open(file:String, inout ppdb:COpaquePointer) -> Int 

您可以使用“String”类型参数而不是“CString”来调用此函数。 swift编译器会自动将“String”转换为UTF8 String数据流。

let error = sqlite3_open(filePath, &db)