Android,变音符号不敏感 SQLite 搜索
Posted
技术标签:
【中文标题】Android,变音符号不敏感 SQLite 搜索【英文标题】:Android, Diacritic Insensitive SQLite Search 【发布时间】:2012-09-19 09:33:26 【问题描述】:我正在尝试在 android 中查询 SQLite 数据库,其中带有重音符号的法语字符应像普通拉丁字符一样处理,例如:
SELECT * FROM x WHERE y LIKE %cafe%
应该返回
café, câfè, ...
我已经用谷歌搜索了一整天,并阅读了关于 *** 的所有相关帖子。 无法向包含规范化标题的表添加列,因为数据库是从服务器获取并由第三方维护的。
使用其他帖子中提到的排序规则,例如
Latin1_general_CI_AI
也没有选择,因为 SQLite 仅支持 3(在 android 5 中)对我没有帮助的排序规则。
将android中的数据库设置为
Locale.FRENCH
并使用排序规则
COLLATE LOCALIZED
也不行。
我知道 ios (DiacriticInsensitiveSearch) 中有一些标志会自动执行此操作,所以我希望类似的东西也可用于 android。
有什么想法吗?提前致谢!
【问题讨论】:
根据 sqlite.org/datatype3.html 第 6 节,我认为 sqlite3 不支持那种东西 然而,根据这个问题***.com/questions/3480999/… = 比较可能有效 不确定 FTS3/4 是否可以以某种方式做到这一点,但您可以尝试一下。不过***.com/q/12500799/995891 对这些字符有问题。 感谢您的回答 njzk2。 =比较有效,但在我的情况下,因为字符串“cafe”也应该找到像“café au lait”这样的标题。如果我使用 = 比较,情况并非如此......但无论如何谢谢! @zapl:谢谢!会检查一下,让你知道我发现了什么! 【参考方案1】:无法向表中添加包含规范化标题的列,因为数据库是从服务器获取并由第三方维护的。
您可以使用规范化列和原始表的外键创建单独的表。我认为这是您在 android 上使用 sqlite 的唯一选择。
或者如果你能以某种方式创建用户定义函数remove_diacritics
,那么你会选择这样的:
SELECT * FROM x WHERE remove_diacritics(lower(y))
LIKE remove_diacritics(lower(%cafe%))
但要注意x.y
上的索引不会被使用。您也可能不需要lower
。但据我所知,如果可能的话,在 sqlite 上创建函数并不是那么容易。
【讨论】:
感谢您的回答 Oliv:“您可以使用规范化列创建单独的表”-不,因为这应该是通用的。每当发生变化时,我都无法维护表格......“如果可能的话,在 sqlite 上创建函数并不是那么容易” - 不幸的是这是不可能的...... 您可以在每次获取后更新第二个表...顺便问一下,“数据库是从服务器获取的”是什么意思?你自己取吗?提取过程本身不能创建两列吗? 嗯,数据库位于服务器上,客户不时上传一个新的。也许 fetch 过程可以做到,但我需要一个算法来告诉这个过程,é、è 和 ê 是 e... 会看到...以上是关于Android,变音符号不敏感 SQLite 搜索的主要内容,如果未能解决你的问题,请参考以下文章
如何使用正则表达式搜索忽略 NSPredicate 的某些字符?