0

Androidのクイック検索ボックスを使って辞書を作ってみました。SearchableDictionaryチュートリアルに示されているように、すべての(999定義)データをロードし、それらを入力テキストとの一致として使用して、検索候補を取得します。私の場合、ユーザーがQSBに単語を入力するときに提案する必要がある、26963行のデータがあります。したがって、必要な提案を効率的にロードできるように、QSBからcharデータを1つずつ取得したいと思います。これどうやってするの?

これが私が使用するコードです...

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

一般に、カーソルの取得は低速です。一致するすべての結果を含む 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()コードが読みにくくなるためです。ssbringIt()

于 2011-02-27T13:18:08.460 に答える
0

SQL Lite の全文検索拡張機能を見ることができます。アイデアは、すべての結果ではなく、一致する結果のみをフェッチしてからフィルタリングする SQL クエリを用意することです。Android SDK のサンプルもあります: com/example/android/searchabledict/DictionaryDatabase

于 2011-02-27T11:30:53.150 に答える