如何制作一个 NSPredicate 来正确过滤本地字符?
How do I make an NSPredicate that filters local characters properly?
我的应用程序使用 Realm 数据库来存储许多项目。使用 SearchBar,我搜索(不区分大小写)一个可能已经存储在数据库中的项目(如果没有,它将被添加)。项目名称通常包含瑞典字符之一,我的问题是,在搜索瑞典字符(å、ä 或 ö)时,过滤器也会通过 "a" 或 "o",即搜索“ä”结果为 a/A、å/Å 和 ä/Ä。
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()
}
}
}
这似乎是 Realm filter
实现中的一个错误。如果您向包含相同对象的 NSArray
提供相同的谓词,则那些 return 会得到正确的结果。
class Person: Object {
@objc dynamic var name:String = ""
}
let people = stringsWithAccents.map{Person(value: ["name":[=10=]])}
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 上 opened an issue。
同时,作为一种解决方法,您可以手动检查小写和大写版本:
let customCaseInsentiveNamePredicate = NSPredicate(format: "name CONTAINS %@ OR name CONTAINS %@", searchString, searchString.uppercased())
print(realm.objects(Person.self).filter(customCaseInsentiveNamePredicate))
我的应用程序使用 Realm 数据库来存储许多项目。使用 SearchBar,我搜索(不区分大小写)一个可能已经存储在数据库中的项目(如果没有,它将被添加)。项目名称通常包含瑞典字符之一,我的问题是,在搜索瑞典字符(å、ä 或 ö)时,过滤器也会通过 "a" 或 "o",即搜索“ä”结果为 a/A、å/Å 和 ä/Ä。
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()
}
}
}
这似乎是 Realm filter
实现中的一个错误。如果您向包含相同对象的 NSArray
提供相同的谓词,则那些 return 会得到正确的结果。
class Person: Object {
@objc dynamic var name:String = ""
}
let people = stringsWithAccents.map{Person(value: ["name":[=10=]])}
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 上 opened an issue。
同时,作为一种解决方法,您可以手动检查小写和大写版本:
let customCaseInsentiveNamePredicate = NSPredicate(format: "name CONTAINS %@ OR name CONTAINS %@", searchString, searchString.uppercased())
print(realm.objects(Person.self).filter(customCaseInsentiveNamePredicate))