在Swift中编译的iOS Sqlite是哪种线程模式?

在Swift中编译的iOS Sqlite是哪种线程模式?,ios,swift,sqlite,Ios,Swift,Sqlite,该页提到: 单线 多线程 连载 我们如何在Swift中实现这些线程。或者如何在Swift中使用sqlite3\u-config(SQLITE\u-config\u-multi-thread而不是sqlite3\u-config打开数据库时可以添加所需的选项。这仅适用于sqlite3\u-open\u v2,不适用于sqlite3\u-open或sqlite3\u-open16 以下是一个例子: let rc = sqlite3_open_v2(databasePath, &db, SQL

该页提到:

单线

多线程

连载


我们如何在Swift中实现这些线程。或者如何在Swift中使用
sqlite3\u-config(SQLITE\u-config\u-multi-thread
而不是
sqlite3\u-config
打开数据库时可以添加所需的选项。这仅适用于
sqlite3\u-open\u v2
,不适用于
sqlite3\u-open
sqlite3\u-open16

以下是一个例子:

let rc = sqlite3_open_v2(databasePath, &db, SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE|SQLITE_OPEN_FULLMUTEX, nil)

对于在这里寻找使用内置sqlite3模块调用sqlite3_config(不管线程问题)的方法的人

它不可用的原因是它使用省略号样式的可变参数,而根据Swift不支持这些参数。解决这一问题的一种方法是使用包装函数创建自己的C头,用于调用sqlite3_config,并使用所需的任何(非可变)参数排列

例如,类似这样的“桥接头”涵盖了您可能需要的所有有效调用签名(只要SQLite配置选项需要):

也许有更干净或更惯用的方法来创建这类包装(而不是桥接头中的静态内联函数)。我不是这方面的专家。但考虑到它们只是包装调用,这似乎是一个很好的轻量级解决方法

如果您不知道如何创建桥接头,可以四处搜索有关桥接头的更多信息。但简而言之,您可以“手动”(在创建.h文件后)创建桥接头通过转到Build Settings/Swift Compiler-General/Objective-C桥接头并将值设置为您创建的头文件名。如果不这样做,则会忽略您的.h文件。或者您可以自动创建一个(无需进入编译器设置)通过将一个伪.c文件拖动到项目中,删除该文件,然后编辑它创建的头文件。或者,如果您更喜欢那里的代码而不是内联代码,可以使用“真实”的c文件来执行此操作

在此基础上,下面是一个使用sqlite3_config安装您自己的日志回调的示例:

import SQLite3

func errorLogCallback(_: OpaquePointer?, iErrCode: Int, zMsg: UnsafePointer<CChar>)
{
    let s = String(cString: zMsg)
    print("LOG:", iErrCode, s)
}

let cCallbackPtr: @convention(c) (OpaquePointer?, Int, UnsafePointer<CChar>) -> () = errorLogCallback
let rawPtr = unsafeBitCast(cCallbackPtr, to: UnsafeMutableRawPointer.self)
sqlite3_config_ptr_ptr(SQLITE_CONFIG_LOG, rawPtr, nil)
导入SQLite3 func errorLogCallback(uquot:OpaquePointer?,iercode:Int,zMsg:UnsafePointer) { 设s=String(cString:zMsg) 打印(“日志:”,iErrCode,s) } 让cCallbackPtr:@convention(c)(OpaquePointer?,Int,UnsafePointer)->()=errorLogCallback 让rawPtr=unsafeBitCast(cCallbackPtr,to:UnsafeMutableRawPointer.self) sqlite3_config_ptr_ptr(SQLITE_config_LOG,rawPtr,nil)
即使在添加了桥接文件之后也要进行检查,我们无法使用sqlite3\u配置。因此,您的问题必须重新定义。如果我使用
sqlite3\u open\u v2(databasePath,&db,SQLITE\u open\u FULLMUTEX,nil)打开数据库
,我可以在一个进程中打开,并在另一个进程打开和读取的同时写入?
import SQLite3

func errorLogCallback(_: OpaquePointer?, iErrCode: Int, zMsg: UnsafePointer<CChar>)
{
    let s = String(cString: zMsg)
    print("LOG:", iErrCode, s)
}

let cCallbackPtr: @convention(c) (OpaquePointer?, Int, UnsafePointer<CChar>) -> () = errorLogCallback
let rawPtr = unsafeBitCast(cCallbackPtr, to: UnsafeMutableRawPointer.self)
sqlite3_config_ptr_ptr(SQLITE_CONFIG_LOG, rawPtr, nil)