#swift #sqlite #sqlite.swift
#swift #sqlite #sqlite.swift
Вопрос:
Я использую like со строчными и русскими символами, но LOWER не преобразует их в нижний регистр в запросе. Я попытался создать свою собственную функцию, но у меня это не сработало. Как решить эту проблему?
Изучив документацию SQLite, я узнал, что нужно подключить библиотеку ICU. Как это можно сделать в этом плагине?
Библиотека: stephencelis/SQLite.swift (https://github.com/stephencelis/SQLite.swift ) Спасибо за помощь.
// in name value: ПРИВЕТ from database
let search_name = "Привет"
user.filter(name.lowercaseString.like("%" search_name.lowercased() "%"))
Ответ №1:
SQLite LOWER предназначен только для ASCII. Если вы хотите, чтобы для русского языка (или любых других символов, кроме ASCII) не учитывался регистр, используйте FTS3 / FTS4 https://www.sqlite.org/fts3.html (или FTS5 https://www.sqlite.org/fts5.html ).
SQLite.swift имеет соответствующие модули полнотекстового поиска https://github.com/stephencelis/SQLite.swift/blob/master/Documentation/Index.md#full-text-search
Чтобы использовать его в своем проекте с существующей базой данных, вы должны установить соединение с виртуальной таблицей через модуль FTS и отфильтровать запрос с помощью .match
// CREATE VIRTUAL TABLE "table" USING fts4("row0", "row1"), if not exists
try db.run(table.create(.FTS4(row0, row1), ifNotExists: true))
// SELECT * FROM "table" WHERE "row0" MATCH 'textToMatch*'
try db.prepare(table.filter(row0.match("(textToMatch)*")))
// SELECT * FROM "table" WHERE "any row" MATCH 'textToMatch*'
try db.prepare(table.match("(textToMatch)*")))