当前位置: 首页 > 面试题库 >

UnsafePointer的问题 在Swift的SQLite项目中

锺星洲
2023-03-14
问题内容

我们正在Swift中的iOS中实现SQLite,而不使用包装器或Objective-
C桥接。一切正常,除非进行查询并提取结果。问题是UnsafePointer<UInt8>从Swift中的SQLite返回的,如下所示:

var querySQL = "SELECT address, phone FROM CONTACTS WHERE NAME = 'myName'"
var cQuery = querySQL.cStringUsingEncoding(NSUTF8StringEncoding)
var statement: COpaquePointer = nil
if sqlite3_prepare_v2(contactsDB, cQuery!, -1, &statement, nil) == SQLITE_OK {
   if sqlite3_step(statement) == SQLITE_ROW {
   var address : UnsafePointer<UInt8> = sqlite3_column_text(statement, 0)
   var data = NSData(bytes: address, length: 10)
   var string = NSString(data: data, encoding: NSUTF8StringEncoding)
   println(string)

如您所见,如果知道对象的长度(在本例中为10),则可以将指针转换为String。

为了深入研究这个问题,我有以下示例

let pointerFromString: UnsafePointer<Int8> = "xyz".cStringUsingEncoding(NSUTF8StringEncoding)
let stringFromPointer = String.fromCString(anotherPointerFromString_Int8)                    println(stringFromPointer!)

鉴于这CChar是的别名Int8,我可以将转换StringUnsafePointer<Int8>using
.cStringUsingEncoding(),然后再转换为Stringusing.fromCString(<UnsafePointer_CChar>)

问题是我的SQLite结果是UnsafePointer_UInt8,不能与.fromCString()

最重要的问题是:是否可以将a转换或转换UnsafePointer_UInt8UnsafePointer_Int8


问题答案:

这应该工作:

let address = sqlite3_column_text(statement, 0)
let string = String.fromCString(UnsafePointer<CChar>(address))






let string = String(cString: sqlite3_column_text(statement, 0))

更新:

sqlite3_column_text()返回一个 隐式展开的可选, 这就是为什么您可以将其String(cString:)直接传递给它。

但是根据Column方法,错误和NULL处理#41,返回值
可以 为null(在内存不足的情况下,或者使用NULL列类型调用时)。因此,这样做更安全

if let text = sqlite3_column_text(statement, 0) {
    let string = String(cString: text)
    // ...
} else {
    // sqlite3_column_text() returned NULL
}


 类似资料:
  • 背景: 我在同一个解决方案中有一个Web API项目和一个类库项目,它们共享相同的模型类。两个项目共享同一个数据库,并且都使用DbContext来读/写数据。 Web API项目以典型的UnitOfWork模式设置,工作正常。 这个班级项目有点不同。我在构造函数中指定连接字符串,而不是在Web中指定。配置文件: 我使用WebAPI调用类库中定义的函数。当我试图使用类库查询数据库时,我得到一个错误。

  • 问题内容: 我正在寻找一种使用Swift代码在我的应用程序中访问SQLite数据库的方法。 我知道我可以在Objective C中使用SQLite包装器并使用桥接头,但是我希望能够完全在Swift中完成此项目。如果可以的话,有没有办法做到这一点,有人可以将我指向一个引用,该引用显示了如何提交查询,检索行等。 问题答案: 虽然您可能应该使用许多SQLite包装器之一,但如果您想知道如何自己调用SQL

  • 当我想要在中创建一个新的项目时,当我进入命名项目的阶段时,我会收到以下错误消息: "无法自动设置JavaFX平台。请转到Platform Manager,创建一个非默认JavaSE平台,然后转到JavaFX选项卡,启用JavaFX并填写有效JavaFX SDK和JavaFX运行时的路径。注意:JavaFX SDK可从JavaFX网站下载” 我如何解决这个问题?

  • 问题内容: 我尝试在sqlite数据库上使用正则表达式和python检查带有模式的字符串。当我尝试使用具有“的模式”的de搜索字符串时出现问题,例如: 我应该在正则表达式之前以其他方式编译器不喜欢…语法错误 有人知道该怎么做吗? 我的正则表达式函数:con.create_function(“ regexp”,2,regexp) 问题答案: 使用参数化的sql。然后,您无需自己转义引号: 产量

  • 我正在转换我的rails 5.1应用程序,开始使用UUID而不是增量id作为默认的active_record。 我已将迁移文件更改为使用 我添加了一个迁移文件来支持“uuid-ossp”和“pgcrypto”,因为我打算在prod中使用pg。 但是当我尝试创建一个对象时,我得到一个错误,就好像id为空一样。 < code > active record::NotNullViolation:SQLi

  • 我看了看样品,然后跟着它走 (渐变版本为6.8.3) https://docs.gradle.org/6.8.3/samples/sample_building_java_applications_multi_project.html 我只是附加了插件io。Spring演示中的依赖关系管理。java常见约定。gradle文件。 然后运行gradle生成,出现以下错误。 错误:插件请求无效[id:“