使用SQLite LIKE的Android自动完成部分工作

时间:2013-12-18 08:47:24

标签: android sqlite autocomplete sql-like

我的SQLite DB中有一个Restaurants表,其中包含以下记录

| Name   | Latin_Name |
+--------+------------+
| Манаки | Manaki     |
+--------+------------+
| Енрико | Enriko     |
+---------------------+

现在我正在进行这样的搜索:

从我的片段:

String selection = DBHelper.COL_NAME + " LIKE ? OR " +
                    DBHelper.COL_LATIN_NAME + " LIKE ?";

String[] selectionArgs = {"%"+term+"%", "%"+term+"%"};

CursorLoader loader = new CursorLoader(getActivity(), 
                               DatabaseContentProvider.REST_CONTENT_URI, 
                               columns, selection, selectionArgs, null);

内容提供商query方法:

 public Cursor query(Uri uri, String[] projection, String selection,
                    String[] selectionArgs, String sortOrder) {

    db = dbHelper.getReadableDatabase();
    SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
    switch(URI_MATCHER.match(uri)){
        case REST_LIST:
            builder.setTables(DBHelper.REST_TABLE);
            break;
        case REST_ID:
            builder.appendWhere(DBHelper.COL_ID + " = "
                    + uri.getLastPathSegment());
            break;
        default:
            throw new IllegalArgumentException("Unsupported URI: " + uri);
    }
    Cursor cursor = builder.query(db, projection, selection, selectionArgs,
            null, null, sortOrder);


    cursor.setNotificationUri(getContext().getContentResolver(), uri);

    return cursor;
}

非常基本对吗?现在问题来了:

如果出现的term en ,我可以在其他人中看到 Enriko 餐厅。

如果我通过 enri ,我再也看不到 Enriko 了。

同样适用于 Manaki 餐厅,我可以看到 mana 之后, manak 术语为ex)我在结果列表中看不到它。

我正在调试我的ContentProvider并且我意识到光标是空的,所以问题必须是在数据库级别,我猜。

请帮忙。

更新

记住@laalto评论我决定对数据库进行一些测试。在我onCreate()的{​​{1}}方法中,我手动只在表格中插入了这两条记录并且有效。

现在问题是我必须从SQLiteOpenHelper文件夹中附带的onCreate()文件中插入1300条记录json。现在我正在解析assets文件创建一个json然后循环它并为每个对象插入一条记录,用于所有1300个项目。

这种插​​入不适用于SQLite ArrayList<Restaurant>方法。

关于这种填充数据库有什么问题吗?

也许我需要更改文件编码(现在是UTF-8)或者数据库的排序规则,或者LIKE的{​​{1}}是否可以针对数据库进行调整?

2 个答案:

答案 0 :(得分:2)

如果紧急,这是一个快速而肮脏的解决方案。

2.600字符串(1.300西里尔语+ 1.300拉丁语)在内存中处理的值很少:您可以使用

从SQLite中加载所有值
select name, latin_name from restaurants

然后您可以在使用 String.contains 方法搜索匹配字符串时在Java中循环结果集。请记住包含方法区分大小写,因此您应该使用以下内容:

string1.toLowerCase().contains(string2.toLowerCase())

答案 1 :(得分:1)

sqlite文档link

The LIKE operator does a pattern matching comparison. The operand to the right of the LIKE
operator contains the pattern and the left hand operand contains the string to 
match against the pattern. A percent symbol ("%") in the LIKE pattern matches any
sequence of zero or more characters in the string. An underscore ("_") in the LIKE 
pattern matches any single character in the string. Any other character matches 
itself or its lower/upper case equivalent (i.e. case-insensitive matching). 
(A bug: SQLite only understands upper/lower case for ASCII characters by default. 
The LIKE operator is case sensitive by default for unicode characters that are
beyond the ASCII range. For example, the expression 'a' LIKE 'A' is TRUE but 'æ' LIKE 'Æ'   
is FALSE.)