【问题标题】:Table query in iPhone appiPhone 应用中的表格查询
【发布时间】:2010-11-03 14:10:32
【问题描述】:

我有一个表格视图(链接到数据库)和一个搜索栏。当我在搜索栏中输入内容时,我会在数据库中进行快速搜索并在输入时显示结果。

查询如下所示:

SELECT * FROM MyTable WHERE name LIKE '%NAME%'

只要我只使用 ASCII 字符,一切正常。我想要的是输入 ASCII 字符并将它们的等价物与变音符号匹配。例如,如果我输入“Alizee”,我希望它匹配“Alizee”。

有没有办法使查询区域设置不敏感?我对 SQL 中的 COLLATE 选项感到不满,但 SQLite 似乎没有用。我也对 iPhone SDK 3.0 具有“本地化排序规则”感到不满,但我找不到任何有关这意味着什么的文档。 .

谢谢。

【问题讨论】:

    标签: iphone sqlite internationalization diacritics


    【解决方案1】:

    有几个选项可以解决这个问题:

    1. 替换所有重音字符 在执行之前查询,例如

      “迷幻” => “迷幻”
      "À contre-courant" => "一个反对者"
      “坦佩特” => “坦佩特”
      等等

      但这仅适用于输入,所以 你不能有重音字符 数据库本身。简单的解决方案,但 远非完美。

    2. 使用第 3 方库,即 ICU(以下链接)。不过不确定它是否是 iPhone 的最佳选择。

    3. 编写一个或多个自定义 C 函数来进行比较。更多在下面的链接中。

    StackOverflow 上的一些帖子讨论了各种选项:
    How to sort text in sqlite3 with specified locale?
    Case-insensitive UTF-8 string collation for SQLite (C/C++)
    How to implement the accent/diacritic insensitive search in Sqlite?

    还有几个外部链接:
    SQLite and native UNICODE LIKE support in C/C++
    sqlite case and accent insensitive searches

    【讨论】:

    • 谢谢,我决定替换所有重音字符。顺便说一句,我喜欢你的例子。 :)
    【解决方案2】:

    我不确定 SQL,但我认为您绝对可以使用 NSDiacriticInsensitivePredicateOption 来比较内存中的 NSString。

    一个示例是一个 NSArray,其中包含您正在搜索的字符串。您可以使用 NSDiacriticInsensitivePredicateOption 作为比较选项来遍历比较字符串的数组并显示成功的匹配项。

    【讨论】:

    • 谢谢,但我的表最多有 50.000 行,所以内存搜索不是一个选项,很遗憾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    相关资源
    最近更新 更多