ios - 我如何在 SQLite 中执行阿拉伯语搜索而忽略变音符号?
<p><p>我正在尝试提取存储在我的 SQL Lite 数据库中的单词,忽略变音符号,但它总是返回一个空结果。我的数据库包含带有变音符号的阿拉伯语单词,我会使用不包含变音符号的单词进行搜索。</p>
<pre><code> NSString *queryStatement = [initWithFormat:@"SELECT ID,ARABIC, ARABICMEANING, FRENCHINARABIC, FRENCH, BEGINARABIC,BEGINFRENCH,ISFAVORITEFROM DictionaryDB WHERE FRENCHINARABIC LIKE \"%%%@%%\"",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:@"SELECT ID, ARABIC, ARABICMEANING, FRENCHINARABIC, FRENCH, BEGINARABIC, BEGINFRENCH, ISFAVORITE FROM DictionaryDB WHERE contains(FRENCHINARABIC, '%@')", 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 < 2) {
res = NO;
} else {
char *textstr = (char *)sqlite3_value_text(argv);
char *substr = (char *)sqlite3_value_text(argv);
if (textstr && 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, "contains", 2, SQLITE_UTF8, NULL, &contains, NULL, NULL);
if (res != SQLITE_OK) {
NSAssert1(0, @"Error: failed to create function in the database: '%s'.", 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]