我正在尝试在Cocoa macOS应用程序中使用SQLite.swift和Swift检索表中的记录数。根据{{3}},可以使用以下方法来实现:
let users = Table("users")
...
let count = try db.scalar(users.count)
但是,当执行此代码时(从按钮单击事件处理程序中),将引发以下异常:
致命错误:“尝试!”表达式意外引发错误:无法识别的令牌:“:”(代码:1):文件...
有问题的代码是下面的db
访问行。加载视图时,为db
对象分配了一个Connection
对象,该对象是从单独的Database
结构函数返回的。我相信这是有效且无关的,因为其他代码区域正在使用相同的方法成功打开与数据库的连接。
let login = Login()
var db : Connection?
...
let count = try! db?.scalar(login.table.count)
这是它产生的查询表达式。在文本中,这似乎是SELECT count(_:)(*) FROM login
。
但是,有趣的是,如果我使用以下行,则会返回正确的结果。
let count = try! db?.scalar(“SELECT COUNT(*) FROM login”)
此Login
对象的模型为:
import SQLite
public struct Login {
let table = Table("login")
// Bunch of properties for various record fields
init() {}
}
任何人和所有帮助将不胜感激。预先感谢!
答案 0 :(得分:1)
事实证明,SQLite.swift
本身就是一个问题。我几天前在GitHub上发现了以下SQLite.swift
个问题,并报告了该问题。
问题由记者tanzolone描述,如下:
在Xcode 10.2 beta 4中,宏#function显示了不同的行为。如 SQLite.swift在不同的子程序中依赖于#function SQLite查询的组成,链接到无效SQLite的几个错误 语句似乎被引入。
我刚刚使用Xcode 10.2 beta 4和更高版本运行了SQLite.swift测试 有几个与此问题相关的失败。
一个例子如下: 在以下帮助程序功能(Helpers.swift第107行)中:
func wrap<T>(_ expression: Expressible, function: String = #function) -> Expression<T> { return function.wrap(expression) }
从那里调用时
static func count(_ star: Star) -> Expression<UnderlyingType>
在Xcode 10.2 beta 4中运行时该函数的值为
count(_:)
,而不是count
。这导致无效的SQLiteSELECT count(_:)(*) myTable
类型的语句。
项目维护者现在已在HEAD
(当前为1a908a7da11852f252e7c6b6366a4d9f8a7d5272)的最新master
中解决了此问题。
在我的项目中,需要更新的行是我的Podfile
中的以下内容:
pod 'SQLite.swift/SQLCipher', :git => 'https://github.com/stephencelis/SQLite.swift.git', :commit => 'ed8f603f856e9f1f4adb76b63b7234547257ec5a'
此更新为:
pod 'SQLite.swift/SQLCipher', :git => 'https://github.com/stephencelis/SQLite.swift.git', :branch => 'master'
或者,可以引用提交本身:
pod 'SQLite.swift/SQLCipher', :git => 'https://github.com/stephencelis/SQLite.swift.git', :commit => '1a908a7da11852f252e7c6b6366a4d9f8a7d5272'
要更新此参考,我在项目根目录中执行了以下CLI步骤,以删除,更新和安装项目Pod:
$ pod cache clean --all
$ rm -rf Pods/
$ rm Podfile.lock
$ open -a Xcode Podfile # Updated the SQLite.swift project ref to the above
$ pod install
这便解决了该问题,并且不再引发异常。