Как мне создать NSP-предикат, который правильно фильтрует локальные символы? - PullRequest
0 голосов
/ 11 февраля 2019

Мое приложение использует базу данных Realm для хранения нескольких элементов.С помощью SearchBar я ищу (без учета регистра) элемент, который может быть уже сохранен в базе данных (и если нет, он будет добавлен).Имена элементов часто содержат один из шведских символов, и моя проблема в том, что при поиске шведского символа (å, ä или ö) фильтр также передает «a» или «o», то есть поиск результатов «ä»в а / д, е / а и а / а.

extension ItemsVC: UISearchResultsUpdating {

    func updateSearchResults(for searchController: UISearchController) {

        if isFiltering() {
            let predicate = NSPredicate(format: "name CONTAINS[cd] %@ AND NONE owners.name == %@", searchController.searchBar.text!, (category?.name)!)
            items = realm.objects(Item.self).filter(predicate).sorted(byKeyPath: "name", ascending: true)

            tableView.reloadData()
        }
    }
}

1 Ответ

0 голосов
/ 11 февраля 2019

Это похоже на ошибку в реализации filter в Realm.Если вы предоставите один и тот же предикат для NSArray, содержащего те же Объекты, они вернут правильные результаты.

class Person: Object {
    @objc dynamic var name:String = ""
}

let people = stringsWithAccents.map{Person(value: ["name":$0])}
try realm.write {
    realm.add(people)
}

let namePredicate = NSPredicate(format: "name CONTAINS[c] %@", searchString)
let foundPeople = realm.objects(Person.self).filter(namePredicate)
print(foundPeople) // Results<Person> <0x7fec74c13060> ( [0] Person { name = á; })

print((people as NSArray).filtered(using: namePredicate)) // [Person { name = á;},Personn { name = Á;}]

Я открыл проблему в RealmCocoa GitHub.

Тем временем, в качестве обходного пути, вы можете вручную проверить версию как в нижнем, так и в верхнем регистре:

let customCaseInsentiveNamePredicate = NSPredicate(format: "name CONTAINS %@ OR name CONTAINS %@", searchString, searchString.uppercased())
print(realm.objects(Person.self).filter(customCaseInsentiveNamePredicate))
...