我有大量字符串,大约 15,000 个,我使用以下代码存储在 SQLite 数据库中:
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 上打字时实时执行此操作,因此响应时间是关键,而现在的情况是需要一秒钟以上的时间来完成搜索。
我考虑过先将所有项目读入一个数组列表,然后排序可能更快,但我认为该大小的数组列表可能会导致内存问题。在我的数据库中搜索这些条目的最佳方式是什么?
最佳答案
您可以做几件事...
- 将返回更改为 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();
}
请注意,即使您希望这对用户“实时”发生,您仍然需要将其移动到单独的线程或 ASyncTask 中,否则您将遇到问题....
关于android - 搜索存储在 sqlite 数据库中的字符串的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13695904/