0

我尝试使用 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 来收集数据。其他代码与教程相同...

4

2 回答 2

1

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

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

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

有关更多信息,请参阅SQLite FTS 扩展。您还可以使用通配符来匹配单词的一部分。

在搜索建议方面,返回超过约 100 个结果确实没有意义,因为通常没有用户会费心向下滚动那么远,因此您可以通过LIMIT 0, 100在 SQL 语句的末尾添加 a 来进一步加快速度。

如果可能,仅在用户输入超过 X 个字符(通常是 3 个,但在您的情况下这可能不合适)时才开始获取光标。这样,您就不会执行可能匹配数千个项目的搜索。

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

在一个不相关的注释上:请不要命名你的变量和方法,ss或者bringIt()因为它使代码难以阅读 - 究竟是什么ss以及带来了什么?bringIt()

于 2011-02-27T13:18:08.460 回答
0

您可以查看SQL Lite 中的全文搜索扩展。想法是有一个 SQL 查询,它只获取匹配的结果,而不是所有的结果然后过滤。Android SDK 也有一个示例:com/example/android/searchabledict/DictionaryDatabase

于 2011-02-27T11:30:53.150 回答