Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在搜索中处理sqlite数据库_Java_Android_Sqlite_Cursor_Android Sqlite - Fatal编程技术网

Java 在搜索中处理sqlite数据库

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

在我的应用程序中,有搜索栏,用户在其中键入文本。每当文本在该字段中得到更改时,我将调用对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;
            }
下面是我在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中尝试过这样做,但在游标适配器上没有。