Android 搜索存储在sqlite数据库中的字符串的最快方法
我有大量字符串,大约15000个,我使用以下代码存储在SQLite数据库中:Android 搜索存储在sqlite数据库中的字符串的最快方法,android,sqlite,Android,Sqlite,我有大量字符串,大约15000个,我使用以下代码存储在SQLite数据库中: void addKey(String key, String value, String table) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_KEY, key); // Contact Na
void addKey(String key, String value, String table) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_KEY, key); // Contact Name
values.put(KEY_VALUE, value); // Contact Phone
// Inserting Row
db.insert(table, null, values);
db.close(); // Closing database connection
}
然后,我使用以下方法搜索该数据库,以便找出与我要查找的键匹配的任何字符串:
public String searchKeyString(String key, String table){
String rtn = "";
Log.d("searchKeyString",table);
// Select All Query
String selectQuery = "SELECT * FROM " + table;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Log.d("searchKeyString","searching");
if(cursor.getString(1).equals(key))
rtn = rtn + "," + cursor.getString(2);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
Log.d("searchKeyString","finish search");
return rtn;
}
我们的目标是在用户在keep board上键入内容时实时执行此操作,因此响应时间是关键,而现在的状态需要一秒钟的时间来完成搜索
我最初考虑将所有项读入一个数组列表,并对其中可能更快的项进行排序,但我认为这样大小的数组列表可能会导致内存问题。在我的数据库中搜索这些条目的最佳方式是什么?我不知道更好,但也许逐条查询所选字符串会更快
public String searchKeyString(String key, String table){
String rtn = "";
Log.d("searchKeyString",table);
// Select All Query
String selectQuery = "SELECT * FROM " + table + "WHERE column_1 = " + key;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
rtn = rtn + "," + cursor.getString(2);
}
cursor.close();
db.close();
Log.d("searchKeyString","finish search");
return rtn;
}
编辑:
我不知道这些自定义键盘应用程序是如何实现的,但是那些autocompletetextview
都连接到了适配器上。您也可以轻松地制作一个光标或适配器
,并将自动完成视图与之挂钩
让sqlite来做硬提升 首先,如果您还没有索引,请将索引添加到您正在搜索的字段中。其次,不要使用手动表扫描进行全选,而是使用表单中的查询
SELECT column_value
FROM my_table
WHERE column_key LIKE "ABC%"
<>这会返回最少的数据,SQL引擎使用index .< /p> ,例如,您应该考虑从表限制50 中使用<代码> SELECT*。您可以在视图上放置两个按钮“后退”,“下一步”。如果每个页面最多有50个项目,用户位于第1页,并点击“下一步”,则可以使用此查询:
SELECT * FROM your-table LIMIT 50 OFFSET 50
如果你的表包含了大部分的文本数据,并且你想将搜索深入到你的应用程序中,请考虑使用./p> < p>虚拟表。
- 将返回更改为StringBuilder,直到结束
- 只使用可读版本的数据库(不过这可能没有多大区别)
- 不要每次都获取数据库的新实例,请将其保持打开状态,直到不再需要它为止
- 使用SQL查询中的“WHERE”参数仅查询所需内容
// move this somewhere else in your Activity or such
SQLiteDatabase db = this.getReadableDatabase();
public String searchKeyString(String key, String table){
StringBuilder rtn = new StringBuilder();
Log.d("searchKeyString",table);
// Select All Query
String selectQuery = "SELECT * FROM " + table + " WHERE KEY_KEY=?";
Cursor cursor = db.rawQuery(selectQuery, new String[] {key});
// you can change it to
// db.rawQuery("SELECT * FROM "+table+" WHERE KEY_KEY LIKE ?", new String[] {key+"%"});
// if you want to get everything starting with that key value
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Log.d("searchKeyString","searching");
rtn.append(",").append(cursor.getString(2));
} while (cursor.moveToNext());
}
cursor.close();
Log.d("searchKeyString","finish search");
return rtn.toString();
}
注意:即使您希望用户“实时”执行此操作,您仍然需要将其移动到单独的线程或异步任务,否则您将遇到问题。…您是否正在寻找类似于
自动完成文本视图的功能?
?实际上是的。。。或者类似的,至少我正在为一个定制键盘做文本预测我不想粗鲁或要求太多,但你能把它写在我的搜索类中,这样我就能更好地理解它是如何工作的,以及如何使用它吗?这很有效,谢谢,我将把它放到一个异步任务中,我实际上有一些类似的东西,所以,当你把它放在一个异步任务中时,有几件事你需要小心,或者至少要记住。。。一次只能运行一个查询;查询可能需要很长时间;“稍后”的查询仍然可以提前完成;您不应该查询已经过时的内容(当用户键入更多内容时)。。。祝你好运还有一件事。。。为了加快SQLite查询的速度,如果您只需要在该列上构建一个索引来搜索相等性,请检查您不应该像这样构建SQL查询。使用准备好的语句而不是字符串连接。有关更多详细信息,请参见:和