如何使NSPredicate正确过滤本地字符?

时间:2019-02-11 00:06:38

标签: swift filter realm nspredicate character-set

我的应用程序正在使用Realm数据库存储许多项目。使用SearchBar,我搜索(不区分大小写)一个可能已经存储在数据库中的项目(如果没有,则将其添加)。项目名称通常包含瑞典语字符之一,而我的问题是,当搜索瑞典语字符(å,ä或ö)时,过滤器也会通过“ a”或“ o”,即搜索“ä”结果在a / A,å/Å和ä/Ä中。

    case R.id.showspinner:
            spinnershow();
            ArrayList<Favoritos> secciones=
                    new ArrayList<Favoritos>();

            try {
                objcon = new mysql(this, null, null, 1);

                SQLiteDatabase db = objcon.getReadableDatabase();
                Cursor rs = db.rawQuery("select * from Favoritos order by 
                nombre ", null);

                Favoritos obj;
                while(rs.moveToNext()){
                    obj=new Favoritos();
                    obj.setNombre(rs.getString(0));
                    obj.setUrl(rs.getString(1));
                    secciones.add(obj);

                }

            } catch (Exception e) {
                // TODO: handle exception
            }

            ArrayAdapter<Favoritos> adaptador=
                    new ArrayAdapter<Favoritos>(this, 
             R.layout.spinner_item,
                            secciones);

            spinner.setAdapter(adaptador);

1 个答案:

答案 0 :(得分:0)

这似乎是Realm的filter实现中的错误。如果为包含相同对象的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上opened an issue

与此同时,您可以手动检查小写和大写版本:

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