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

dja*_*ski 7 sqlite android autocomplete sql-like

Restaurants我的SQLite DB中有一个表,它有以下记录

| Name   | Latin_Name |
+--------+------------+
| ?????? | Manaki     |
+--------+------------+
| ?????? | Enriko     |
+---------------------+
Run Code Online (Sandbox Code Playgroud)

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

从我的片段:

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);
Run Code Online (Sandbox Code Playgroud)

内容提供商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;
}
Run Code Online (Sandbox Code Playgroud)

那么基本对吧?现在问题来了:

如果term进来的话,en我可以看到Enriko餐厅和其他餐厅.

如果我通过,enri我不能再看到Enriko了.

同样适用于Manaki餐厅我可以看到它之前mana和之后(manak对于ex for term)我在结果列表中看不到它.

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

请帮忙.

更新:

考虑到@laalto评论,我决定对数据库进行一些测试.在onCreate()我的方法中,我SQLiteOpenHelper手工插入表中的那两个记录并且它起作用.

现在的问题是我必须onCreate()json文件assets夹中提供的文件中插入1300条记录.现在我正在解析json文件,ArrayList<Restaurant>然后通过它创建一个循环,并为每个对象插入一条记录,用于所有1300个项目.

这种插入不适用于SQLite LIKE方法.

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

也许我需要更改文件编码(现在是UTF-8)或者数据库的整理,或者可以getString()JSONObject数据库中调整?

Giu*_*one 2

如果情况紧急,这里有一个快速但肮脏的解决方案。

2.600 个字符串(1.300 西里尔字母 + 1.300 拉丁字母)实际上是内存中需要处理的很少的值:您可以简单地从 SQLite 加载所有值

select name, latin_name from restaurants
Run Code Online (Sandbox Code Playgroud)

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

string1.toLowerCase().contains(string2.toLowerCase())
Run Code Online (Sandbox Code Playgroud)