0

EditText ボックスがあります。このテキスト ボックスでは、afterTextChanged(Editable s)メソッドを使用しました。約 60,000 のデータを含むデータベースがあります。私は辞書を作っています。したがって、私の目的は、ユーザーがテキストボックス (EditText) にテキストを入力すると、入力されたテキストと一致するデータベースからリストビューに 10 行が表示されることです。

私のメインアクティビティでは、次のafterTextChanged(Editable s)ように使用しました

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

            mDbHelper.open();

            String ss=s.toString();

             ArrayList<HashMap<String, String>> list_of_wordmeanings = new ArrayList<HashMap<String, String>>();

            Cursor mCursor = mDbHelper.getTestData(ss); // here i got the result from the database

            for (int i = 0; i < mCursor.getCount(); i++) 
            {
                mCursor.moveToPosition(i);                                      

                HashMap<String, String> hm = new HashMap<String, String>();

                    String word = mCursor.getString(0).toString();
                    String meaning = mCursor.getString(1).toString();

                      hm.put("key_word",word);
                      hm.put("key_meaning",meaning);

                      list_of_wordmeanings.add(hm);
            }

                    String[] from = { "key_word","key_meaning" };

                    int[] to = { R.id.txt1,R.id.txt2};

                    SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), list_of_wordmeanings, R.layout.list_layout, from, to);

                    listView.setAdapter(adapter);

                    mDbHelper.close();

        }
    });

データベースからデータを取得するために使用した関数は次のとおりです。

public Cursor getTestData(String s)
 {
     try
     {

     //String sql ="SELECT * FROM Table1 LIMIT 5";//"SELECT  * FROM " + TABLE_REGISTRATION +" WHERE "+ KEY_NAME +" LIKE '"+ s +"%'" ;

         String sql ="SELECT  * FROM dic WHERE english LIKE '"+ s +"%' LIMIT 5" ;

         Cursor mCur = mDb.rawQuery(sql, null);
         if (mCur!=null)
         {
            mCur.moveToNext();
         }
         return mCur;
     }
     catch (SQLException mSQLException) 
     {
         Log.e(TAG, "getTestData >>"+ mSQLException.toString());
         throw mSQLException;
     }
 }

すべてがうまく機能していますが、一致する結果の表示が非常に遅いという問題があります。どうすればもっと速くできますか?? 誰かが私に適切な解決策を教えてもらえますか????

4

1 に答える 1

0

あなたのafterTextChanged()方法は非常に非効率的です。次の変更で改善できます。

afterTextChanged()ユーザーがテキストを変更する (およびget メソッドが呼び出される)たびに、データベースを開いたり閉じたりしないでください。mDbHelper.open();そのため、毎回行うのではなく、代わりに次のようにします。

if (!mDbHelper.isDataBaseOpen()) {
    // the database is not open so open it
    mDbHelper.open();// for future text entered the database will be already open  
}

その後、後でデータベースを閉じます ( のようonPauseActivity)。

からデータを抽出して に配置する理由はありCursorません。より効率的であり、この抽出によって何百ものオブジェクトが作成されるため、避ける必要があることは言うまでもありません。を使用するためにこれを行っている場合は、を とともに使用します (または、独自のアダプターを作成することもできます)。HashMapCursorSimpleAdapterCursorSimpleCursorAdapter

毎回新しいアダプターを作成しないで、代わりに最初のインスタンスを再利用し、そのアダプターのデータのみを更新します (notifyDataSetChanged()呼び出しが続きます)。

メイン UI スレッドでデータベース クエリを実行しないでください (呼び出しで行うafterTextChanged()ようにmDbHelper.getTestData(ss))。また、ユーザーが入力したテキストに基づいて、データベース クエリを 1 つだけ要求することもできます。たとえば、ユーザーがを入力aするCursorと、そのクエリのすべての行が取得されます。しかし、彼が入力した場合、フィルター処理された行が初期セット ( に対して返されたもの)abにあると想定しても安全なので、データを見て必要な値のみを選択することができます。これを見てください。CursoraCursorCursorWrapper

于 2013-08-02T08:54:25.910 に答える