Java 在搜索中处理sqlite数据库
在我的应用程序中,有搜索栏,用户在其中键入文本。每当文本在该字段中得到更改时,我将调用对DB的查询以获取相关的搜索项。但有时它会崩溃 下面是我调用DB的代码Java 在搜索中处理sqlite数据库,java,android,sqlite,cursor,android-sqlite,Java,Android,Sqlite,Cursor,Android Sqlite,在我的应用程序中,有搜索栏,用户在其中键入文本。每当文本在该字段中得到更改时,我将调用对DB的查询以获取相关的搜索项。但有时它会崩溃 下面是我调用DB的代码 @Override public boolean onQueryTextChange(String newText) { // TODO Auto-generated method stub if(newText.tri
@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;
}
下面是我在DB manager中查询的方式
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%")
这可能是因为您在错误的位置关闭光标,并试图在关闭后使用它,但您不能使用已关闭的光标 我会去掉这部分代码:
if(mcursorForFilter != null) {
mcursorForFilter.close();
mcursorForFilter = null;
}
相反,在设置新光标后关闭旧光标swapCursor()
返回旧的光标
,或者如果未设置光标,则返回null
,如果尝试交换先前设置的光标的同一实例,则还返回null
。知道了这一点,您可以尝试以下方式:
Cursor c = mSearchadapter.swapCursor(mfilterdata);
if(c != null)
c.close();
试试看,如果有帮助请告诉我
注意当您使用加载程序(LoaderManager.LoaderCallbacks)时,框架将关闭旧的游标。这是政府所说的:
装载完成:
加载程序一旦知道应用程序不可用,就会释放数据
不再使用它。例如,如果数据是来自
CursorLoader,您不应该自己对其调用close()
为什么-1??你能证明吗?好的,但我得到这个例外,即试图重新打开一个已经关闭的对象。这是因为我的查询语法吗?好的,我这样做了,而且我会随机键入文本,所以每次都需要执行查询并填充适配器。所以,若我的适配器仍在填充,并且已经执行了查询,那个么我可能会崩溃。知道怎么解决吗?嗨,谢谢。我试过你的技术,但是碰撞行为被最小化了。但我还是受到了撞击。我们是否可以使用其他技术查询数据库并显示建议?。我还注意到,在edittext中键入文本时,我感觉键盘滞后,可能是因为重复的db调用,如何防止?有没有办法,我们可以加载完整数据,即从Atable中选择*并根据文本进行筛选。我在string arrayadapter中尝试过这样做,但在游标适配器上没有。