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并将其放入 a 中HashMap,aCursor更有效,更不用说这种提取会创建数百个您应该避免的对象。如果您这样做是为了使用 a SimpleAdapter,那么将aCursor与 a 一起使用SimpleCursorAdapter(或者您可以制作自己的适配器)。

不要每次都创建一个新的适配器,而是重用第一个实例并仅更新该适配器的数据(随后是notifyDataSetChanged()调用)。

您不应该在主 UI 线程上进行数据库查询(就像在afterTextChanged()调用中所做的那样mDbHelper.getTestData(ss))。此外,根据用户输入的文本,您可能只需要一个数据库查询。例如,如果用户输入aCursor获得该查询的所有行。但是,如果他进入ab,那么可以安全地假设过滤后的行将在初始集合中(Cursor返回 for a),因此您可以简单地查看Cursor数据并仅选择您需要的值。看看CursorWrapper这个。

于 2013-08-02T08:54:25.910 回答