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数据库中调整?
如果情况紧急,这里有一个快速但肮脏的解决方案。
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)
| 归档时间: |
|
| 查看次数: |
1185 次 |
| 最近记录: |