在搜索中处理sqlite数据库

时间:2014-05-31 14:25:41

标签: java android sqlite cursor android-sqlite

在我的应用搜索栏中,用户输入文本。每当文本在字段中得到更改时,我都会调用对DB的查询来获取相关的搜索项。但有时会崩溃。

这是我正在调用DB

的代码
                @Override
            public boolean onQueryTextChange(String newText) {
                // TODO Auto-generated method stub

                if(newText.trim().equals(""))
                {
                   return false;
                }


                //showSearchSuggestions(newText);
                mfilterdata = mController.get_controllerObj().getDBManager().getAllSuggestedFilter(newText);

                if(mSearchadapter != null)
                mSearchadapter.swapCursor(mfilterdata);


                return false;
            }

以下是我在数据库管理器中查询的方法

    public Cursor getAllSuggestedFilter(String filterString)
{
       String READ_QUERY = "SELECT * FROM " + Tbl_ITEM_TABLE + " where "+ 
                            item.TITLE + " Like" + "\"%" + filterString + "%"+"\"";

       if(mcursorForFilter != null)
       {
           mcursorForFilter.close();
           mcursorForFilter = null;        
       }

       try
       {
          mcursorForFilter = getReadableDatabase().rawQuery(READ_QUERY, null);
       }
       catch(Exception ee)
       {

       }


       return mcursorForFilter;
}

随机我会得到像

这样的异常
java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT * FROM itemtable where title Like"%t%")

1 个答案:

答案 0 :(得分:0)

这可能是因为您将光标关闭在错误的位置,并在此之后尝试使用它,但您无法使用已经关闭的光标。

我会摆脱这部分代码:

if(mcursorForFilter != null) {
   mcursorForFilter.close();
   mcursorForFilter = null;        
}

而是在设置新光标后关闭旧光标。 swapCursor()返回旧的Cursor,如果没有设置游标,则返回null,如果您尝试交换先前设置的相同实例,则返回null光标。知道了,你可以尝试这样的事情:

Cursor c = mSearchadapter.swapCursor(mfilterdata);

if(c != null)
    c.close();

尝试一下,如果有帮助,请告诉我。

注意当您使用Loader(LoaderManager.LoaderCallbacks)时,框架将关闭旧游标。这就是documentation所说的:

  

onLoadFinished:

     

一旦知道应用程序为no,加载程序就会释放数据   更长时间使用它。例如,如果数据是来自a的光标   CursorLoader,你应该不要自己调用close()。 ...