菜鸟教程小白 发表于 2022-12-12 17:09:43

ios - 我如何在 SQLite 中执行阿拉伯语搜索而忽略变音符号?


                                            <p><p>我正在尝试提取存储在我的 SQL Lite 数据库中的单词,忽略变音符号,但它总是返回一个空结果。我的数据库包含带有变音符号的阿拉伯语单词,我会使用不包含变音符号的单词进行搜索。</p>

<pre><code>    NSString *queryStatement = [initWithFormat:@&#34;SELECT ID,ARABIC, ARABICMEANING, FRENCHINARABIC, FRENCH, BEGINARABIC,BEGINFRENCH,ISFAVORITEFROM DictionaryDB WHERE FRENCHINARABIC LIKE \&#34;%%%@%%\&#34;&#34;,searchedWord];
</code></pre>

<p>例如 searchedWord 可以是 @"أكل"并且可以带有变音符号 @"أَكَلَ"。</p>

<p>我该如何解决这个问题?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我通过创建自己的 SQLite 函数来解决这个问题。</p>

<p>基本思想是你的查询变成:</p>

<pre><code>NSString *queryStatement = [ initWithFormat:@&#34;SELECT ID, ARABIC, ARABICMEANING, FRENCHINARABIC, FRENCH, BEGINARABIC, BEGINFRENCH, ISFAVORITE FROM DictionaryDB WHERE contains(FRENCHINARABIC, &#39;%@&#39;)&#34;, searchedWord];
</code></pre>

<p><code>contains</code> 将是您的自定义函数。</p>

<p>首先你需要编写一个实现<code>contains</code> SQL函数的C函数:</p>

<pre><code>void contains(sqlite3_context *context, int argc, sqlite3_value **argv) {
    BOOL res = NO;
    if (argc &lt; 2) {
      res = NO;
    } else {
      char *textstr = (char *)sqlite3_value_text(argv);
      char *substr = (char *)sqlite3_value_text(argv);
      if (textstr &amp;&amp; substr) {
            NSString *text = ;
            NSString *sub = ;

            // Adjust the options to suit your needs
            NSRange range = ;
            if (range.location != NSNotFound) {
                res = YES;
            }
      }
    }

    sqlite3_result_int(context, res ? 1 : 0);
}
</code></pre>

<p>当你打开你的数据库连接时,你需要注册这个函数:</p>

<pre><code>// dbRef is your database reference
int res = sqlite3_create_function(dbRef, &#34;contains&#34;, 2, SQLITE_UTF8, NULL, &amp;contains, NULL, NULL);
if (res != SQLITE_OK) {
    NSAssert1(0, @&#34;Error: failed to create function in the database: &#39;%s&#39;.&#34;, sqlite3_errmsg(dbRef));
}
</code></pre>

<p>旁注 - 使用 <code>stringWithFormat:</code> 来创建查询是个坏主意。您真的应该考虑使用 <code>sqlite3_bind_xxx</code> 函数将值正确绑定(bind)到查询。如果值包含任何引号或其他特殊值,则使用 <code>stringWithFormat:</code> 将失败。使用 <code>sqlite3_bind_xxx</code> 函数可以正确地引用和转义值。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 我如何在 SQLite 中执行阿拉伯语搜索而忽略变音符号?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/20548083/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/20548083/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 我如何在 SQLite 中执行阿拉伯语搜索而忽略变音符号?