如何使用Android QSB有效管理搜索建议?

时间:2011-02-27 11:26:59

标签: android quick-search

我尝试在Android中使用快速搜索框制作字典。如SearchableDictionary教程所示,它加载所有(999个定义)数据,并将它们用作输入文本的匹配项以获取搜索建议。就我而言,当用户在QSB上输入一个单词时,我需要建议26963行数据。因此,我想从QSB逐个获取char数据,以便有效地加载必要的建议。我怎么能这样做?

这是我使用的代码......

bringit(200);
        if (Intent.ACTION_VIEW.equals(intent.getAction())) {
            // from click on search results
            //Dictionary.getInstance().ensureLoaded(getResources());
            String word = intent.getDataString();
            //if(word.length() > 3){bringit(10);}
            Dictionary.Word theWord = Dictionary.getMatches(word).get(0);
            launchWord(theWord);
            finish();
        } else if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String query = intent.getStringExtra(SearchManager.QUERY);
            //SearchManager.
            //String bb = 
            mTextView.setText(getString(R.string.search_results, query));
            WordAdapter wordAdapter = new WordAdapter(Dictionary.getMatches(query));
            //letsCount(query);
            mList.setAdapter(wordAdapter);
            mList.setOnItemClickListener(wordAdapter);
        }

        Log.d("dict", intent.toString());
        if (intent.getExtras() != null) {
            Log.d("dict", intent.getExtras().keySet().toString());
        }
    }



    private void letsCount(String query) {
        // TODO Auto-generated method stub
        for(int i=0; i<query.length(); i++){
            definite[i] = query.charAt(i);
        }
    }



    public void bringit(int sum) {
        // TODO Auto-generated method stub
        String[] ss = new String[10];

        Log.d("dict", "loading words");

        for(int i=1; i<=sum; i++){
            KamusDbAdapter a = new KamusDbAdapter(getApplicationContext());
            a.open(); 
            Cursor x = a.quick(String.valueOf(i));startManagingCursor(x);
            if(x.moveToFirst()){
                ss[0] = x.getString(1);
                ss[1] = x.getString(2);
            }
            Dictionary.addWord(ss[0].trim(), ss[1].trim());
            Log.v("Debug",ss[0]+" "+ss[1]);
            //onStop();
        }
    }

我使用SQLite来收集数据。其他代码与教程相同......

2 个答案:

答案 0 :(得分:1)

检索游标通常很慢。您只想检索一个包含所有匹配结果的游标。

您应该使用SQL执行搜索而不是获取所有内容。对于文本匹配,FULL_TEXT搜索通常最快,但实现起来比简单LIKE稍微复杂一些,但我强烈建议您尝试一下。

所以你想要执行一个SQL语句,如: SELECT * FROM my_table WHERE subject_column MATCH 'something'

有关详细信息,请参阅SQLite FTS Extension。您也可以使用通配符来匹配单词的一部分。

就搜索建议而言,返回超过约100个结果的确没有任何意义,因为通常没有用户愿意向下滚动那么远,所以你可以通过在末尾添加LIMIT 0, 100来进一步加快速度。您的SQL语句。

如果可能的话,只有当用户输入的X字符数超过X个时才会开始获取游标(通常是3个,但在这种情况下,这可能不合适)。这样,您就不会执行可能会匹配数千件商品的搜索。

你似乎要打开许多游标,直到应用程序关闭它们,即使你实际上不再需要它们:而不是打电话给startManagingCursor,只需确保在x.close()之后调用if (x.moveToFirst()) { ... } 1}} - 这将更快地释放内存。

关于不相关的说明:请不要将变量和方法命名为ssbringIt(),因为它会使代码难以阅读 - 什么是ss <{em>} bringIt()带来了什么?

答案 1 :(得分:0)

您可以查看full text search extension in SQL Lite。想法是让SQL查询仅获取匹配结果,而不是所有结果然后过滤。  Android SDK还有一个示例:com/example/android/searchabledict/DictionaryDatabase