在Android上使用sqlite(使用FTS)

时间:2010-12-13 18:42:06

标签: android sqlite

我正在使用sqlite FTS3数据库,使用我的Android应用程序。

   public Cursor getWordMatches(String query, String[] columns) {
        String selection = KEY_WORD + " MATCH ?";
        String[] selectionArgs = new String[] {query+"*"};
        return query(selection, selectionArgs, columns);
   }

.....

private Cursor query(String selection, String[] selectionArgs, String[] columns) {
    SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
    builder.setTables(FTS_VIRTUAL_TABLE);
    builder.setProjectionMap(mColumnMap);     

    Cursor cursor = builder.query(mDatabaseOpenHelper.getReadableDatabase(),
            columns, selection, selectionArgs, null, null, null);

    if (cursor == null) {
        return null;
    } else if (!cursor.moveToFirst()) {
        cursor.close();
        return null;
    }
    return cursor;
}

如果我查询并搜索'house',我会得到:

household 
house 
apartment house 
big house

(我正在获取其中包含所有内容的所有内容,位于正则表达式 house

如何为查询获得此类结果?

household
house

(所以我只想要以房子开头的结果,在正则表达式中*)

我的android应用程序FORCE CLOSES如果我使用LIKE语句(可能因为db有200000行)。 我应该以某种方式结合MATCH和LIKE语句? 甚至可以在Android上执行此操作,如果不是这样,我可以尝试在从此查询中获取它后在光标上运行一些正则表达式吗?

1 个答案:

答案 0 :(得分:0)

全文搜索表应始终使用MATCH而不是LIKE,因为LIKE查询会执行表的完整扫描,这首先会破坏创建FTS表的目的。

要解决您的问题,请在创建fts表时尝试使用非默认标记器:

-- Create a table using the simple tokenizer.
CREATE VIRTUAL TABLE simple USING fts3(tokenize=porter);

默认情况下,SQLite使用一个简单的标记生成器,它可能会生成您不想要的匹配项。切换到porter tokenizer,看看会发生什么。最坏的情况是,您可以实现自己的自定义标记生成器。有关详细信息,请参阅SQLite documentation