SQLite.swift: не удается получить количество таблиц из-за нераспознанного токена: ":" - PullRequest
2 голосов
/ 19 апреля 2019

Я пытаюсь получить количество записей в таблице, используя SQLite.swift и Swift в приложении MacOS для Cocoa. Согласно README , это может быть достигнуто с помощью следующего:

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.

enter image description here

Однако, что интересно, если я воспользуюсь следующей строкой, вернусь правильный результат.

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 Ответ

2 голосов
/ 22 апреля 2019

Оказалось, что проблема была в самой SQLite.swift, как я и подозревал. Я обнаружил следующие SQLite.swift проблемы на GitHub, сообщавшие об этой проблеме несколько дней назад.

Проблема заключалась в следующем, как описано репортером, tanzolone :

В Xcode 10.2 beta 4 функции macro # показывают другое поведение. Как SQLite.swift использует #function в различных подпрограммах для составление запросов SQLite, несколько ошибок, связанных с неверным SQLite утверждения, кажется, введены.

Я только что выполнил тесты SQLite.swift с Xcode 10.2 beta 4 и с этой проблемой связано несколько сбоев.

Пример выглядит следующим образом: В следующей вспомогательной функции (строка 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 из master (в настоящее время 1a908a7da11852f252e7c6b6366a4d9f8a7d5272 ).

В моем проекте строка, которая требовала обновления, была следующей в моем 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 cache clean --all
$ rm -rf Pods/
$ rm Podfile.lock
$ open -a Xcode Podfile   # Updated the SQLite.swift project ref to the above
$ pod install

Это решило проблему, и исключение больше не выдается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...