android - 搜索存储在 sqlite 数据库中的字符串的最快方法

标签 android sqlite

我有大量字符串,大约 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/

相关文章:

android - `theme`中的 `context.getColor`有什么用?

java - 新的 Intent (上下文,类)抛出 NullPointerException

android - 了解 SQLite 游标行为

mysql - 针对本地数据库的 Rspec 测试

android - 如何获得正确的上下文

java - Android 多线程

android - JSch - 如何使用 Session 和 UserInfo

sql - 设计一个表来存储 EXIF 数据

java - 如果使用 sqlite 存在,如何删除项目?

离线时 Android 缓存只读 REST API 响应