SQLite.swift:由于令牌无法识别而无法检索表计数:“:”

时间:2019-04-19 00:49:20

标签: swift xcode macos sqlite sqlite.swift

我正在尝试在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

README

但是,有趣的是,如果我使用以下行,则会返回正确的结果。

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() {}
}

任何人和所有帮助将不胜感激。预先感谢!

1 个答案:

答案 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。这导致无效的SQLite   SELECT 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

这便解决了该问题,并且不再引发异常。