Swift 中 SQLite 项目中的 UnsafePointer 问题

2024-03-17

我们在 iOS 和 Swift 中实现 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,我可以转换String to UnsafePointer<Int8> using .cStringUsingEncoding(),然后回到String using .fromCString(<UnsafePointer_CChar>)

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

最根本的问题是:是否可以转换或投射UnsafePointer_UInt8 to UnsafePointer_Int8


这应该有效:

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

Swift 3 (Xcode 8) 更新,比较Swift 3:将 null 终止的 UnsafePointer 转换为字符串 https://stackoverflow.com/questions/39533320/swift-3-convert-a-null-terminated-unsafepointeruint8-to-a-string:

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

Update:

sqlite3_column_text()返回一个隐式解包可选,这就是为什么你可以将它传递给String(cString:)直接地。

但根据列方法、错误和 NULL 处理 #41 https://github.com/crawshaw/sqlite/issues/41,返回值can为 null(在内存不足的情况下,或者使用 NULL 列类型调用时)。因此这样做更安全

if let text = sqlite3_column_text(statement, 0) {
    let string = String(cString: text)
    // ...
} else {
    // sqlite3_column_text() returned NULL
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 中 SQLite 项目中的 UnsafePointer 问题 的相关文章

  • 无效图像路径 - 在路径中找不到图像。 CFBundleIcons Xcode 5

    我正在尝试使用 Xcode 5 0 更新我的 iOS 7 应用程序 一切正常 但是当我存档然后验证时 我收到以下消息 图像路径无效 在键下引用的路径中找不到图像CFBundleIcons APP ICON 57 我尝试删除并添加图像 并手动
  • Swift PerformSegueWithIdentifier 不起作用

    我试图在用户成功登录其帐户后切换视图控制器 但它无法正常工作 我无法直接使用 segue 因为如果单击登录按钮 无论信息是否正确 它都会转到该视图控制器 我已经尝试了我所知道的一切 但没有成功 这是我正在尝试的代码 IBAction fun
  • SwiftUI |警告:绑定首选项_尝试每帧更新多次。可能的原因?

    自从我按照偏好工作以来 PreferenceKey 我在控制台中收到此消息 Bound preference tried to update multiple times per frame 经过无数次的研究 我还没有找到任何方法可以让它安
  • 如何在Android中访问Sqlite数据库?

    我可以在模拟器中使用 adb shell 命令访问我的 sqlite 数据库 但无法对我的 HTC Desire 手机执行相同操作 它会抛出一些权限被拒绝的消息 是否有可能访问这些数据库以进行调试 任何想法 提前致谢 您还可以在命令提示符
  • UIWebview JS 性能比 iOS 6/7 上的移动 safari 慢吗?

    我们最近使用 iOS 应用程序中的大量 JavaScript 库测试了一些 HTML5 内容 该应用程序旨在在 UIWebview 中加载这些内容 本次测试使用了 iOS 6 我的团队没有观察到移动 Safari 浏览器出现任何明显的性能问
  • 将 autoResizingMask 与 CGRectZero 结合使用

    我正在为表格视图部分构建页脚 页脚的高度将在中指定heightForFooterInSection so in viewForFooterInSection我只想添加子视图并指定页脚视图应填充指定的任何页脚高度 此页脚大小将是动态的 所以
  • MobileSafari 的正确触摸按钮行为

    MobileSafari 通常具有不正确的 HTML 按钮行为 不正确的含义 不像 iOS 原生按钮 正确的按钮行为如下 用户触摸按钮 按钮突出显示 用户将手指拖出按钮 按钮变暗 用户将手指拖回按钮 按钮突出显示 用户将手指拖出按钮并释放
  • iOS Facebook SDK 通过图搜索来搜索用户

    我是图形搜索新手 我想搜索具有电子邮件地址的用户 那可能吗 现在 我只知道如何使用他们的名字进行搜索 如下所示 https graph facebook com search q chandler de angelis type user
  • ios - 安排无限数量的本地通知

    我有一个应用程序 允许用户创建重复事件 每一个事件在一天中的特定时间可能有也可能没有提醒 警报 如果有的话 应用程序会发送一个本地通知在一天中的那个时候 事件存储在CoreData Event name Go to London date
  • TDD VS BDD:REST 服务

    我对 TDD 与 BDD 很困惑 TDD 和 BDD 在以下各点上有何不同 开发 先测试用例 再开发 RestService HTTP 不进行休息调用 如果是这样 a 我们是否使用模拟对象仅返回硬编码的 json b 如何处理 REST 调
  • 指向指针的指针和指向二维数组的指针之间的区别

    如果我有一个二维数组 B 定义为 int B 2 3 1 3 5 2 4 6 Is int p B与 一样int p 3 B int f B printf d f 1 gives 5作为输出 同时printf d f 给出 1 作为答案 为
  • 在 SpriteKit 中,touchesBegan 是否与 SKScene 更新方法在同一线程中运行?

    在 Apple 文档中高级场景处理 https developer apple com library ios documentation GraphicsAnimation Conceptual SpriteKit PG Actions
  • xamarin 中的本机链接错误

    我今天尝试编译我的 xamarin 项目 突然收到以下错误 错误 MT5210 本机链接失败 未定义符号 mono handle global vregs 请验证是否已引用所有必要的框架并且本机库是否正确 链接到 错误 MT5210 本机链
  • 如何组合两个可变数组?

    我有一个 iPhone 应用程序 我试图在其中添加两个可变数组 NSMutableArray dataArray NSMutableArray alloc init NSMutableArray dataArray1 NSMutableAr
  • SQLite适合并发读吗?

    在没有锁定的情况下 SQLite 数据库的性能是否能达到每秒 50 次读取左右 我正在尝试确定它是否可以在不会经常 写入 的 PHP 网站上使用 它主要是从一小部分表中读取相同的数据 没问题 并发读 写实际上会被 SQLite 序列化 所以
  • 在iOS上,setNeedsDisplay确实不会导致drawRect被调用...除非CALayer的display或drawInContext最终调用了drawRect?

    我不太明白 CALayer 是怎么做的display and drawInContext与 有关drawRect视图中 如果我有一个 NSTimer 来设置 self view setNeedsDisplay 每 1 秒 然后drawRec
  • NSTimer 在后台的行为(addTimer:, beginBackgroundTaskWithExpirationHandler:)

    Xcode 6 3 1 ARC 启用 适用于 iOS 8 3 我需要帮助理解我在应用程序进入后台后尝试在应用程序中维护单例共享计时器时遇到的奇怪行为 以前我不关心这个 NSTimer 因为它是使用后台位置服务在后台更新用户位置的 但是 我想
  • 如果值不为空,则更新数据库的 SQL 查询?

    我有一个大约有 17 个字段的表 我需要在此表中执行频繁更新 但问题是每次我可能只更新几个字段 在这种情况下编写更新查询的最佳方法是什么 我正在寻找一个选项 其中仅当值不为空时才会更新 例如 我在数据库中有四个字段 A B C D 用户更新
  • JS:event.touches 属性如何工作?

    我不明白如何使用 event touches 属性 例如 要获取 iPad iPhone 上的手指数量 您应该使用 event touches length 那么为什么这个示例代码不起作用呢 image bind touchstart fu
  • 致命错误:Swift 2.0 不支持与自身交换位置

    我有这个扩展 它将创建一个新数组 其中包含来自给定数组的随机数组组 extension Array var shuffle Element var elements self for index in 0

随机推荐