从android中的afterTextChanged方法检索Sqlite数据库中的数据变得越来越慢

时间:2013-08-01 05:42:25

标签: android sqlite

我有一个EditText框。在这个文本框中我使用了afterTextChanged(Editable s)方法。 我有一个包含大约60,000个数据的数据库。我正在写一本字典。 所以我的目标是当用户在文本框(EditText)中输入任何文本时,它会从与输入文本匹配的数据库中将10行显示在listview中。

在我的主要活动中,我使用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;
     }
 }

一切都运作良好但问题是显示匹配结果非常慢。 我怎么能以更快的方式做到这一点? 任何人都可以给我适当的解决方案????

1 个答案:

答案 0 :(得分:0)

您的afterTextChanged()方法效率非常低。您可以通过以下更改来改进它:

每次用户更改文本时都不要打开和关闭数据库(并调用afterTextChanged()方法)。所以不要每次都做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  
}

然后您将在稍后关闭数据库(例如onPause的{​​{1}})。

没有理由从Activity中提取数据并将其放在Cursor中,HashMap效率更高,更不用说此提取会创建数百个对象你应该避免。如果您这样做是为了使用Cursor,那么请使用SimpleAdapterCursor(或者您可以制作自己的适配器)。

不要每次都使用新的适配器而是重用第一个实例并仅更新该适配器的数据(后跟SimpleCursorAdapter调用)。

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