Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 搜索存储在sqlite数据库中的字符串的最快方法_Android_Sqlite - Fatal编程技术网

Android 搜索存储在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

我有大量字符串,大约15000个,我使用以下代码存储在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上键入内容时实时执行此操作,因此响应时间是关键,而现在的状态需要一秒钟的时间来完成搜索


我最初考虑将所有项读入一个数组列表,并对其中可能更快的项进行排序,但我认为这样大小的数组列表可能会导致内存问题。在我的数据库中搜索这些条目的最佳方式是什么?

我不知道更好,但也许逐条查询所选字符串会更快

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查询。使用准备好的语句而不是字符串连接。有关更多详细信息,请参见:和