在我的应用搜索栏中,用户输入文本。每当文本在字段中得到更改时,我都会调用对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%")
答案 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()。 ...