Android游标中的“fillWindow()中的invalid语句是什么意思?

问题描述:

我有时会看到这个错误在我logcat输出,Android游标中的“fillWindow()中的invalid语句是什么意思?

Cursor: invalid statement in fillWindow(). 

当我按下返回键有时会发生,然后才去我的自定义listview进入到默认的Android listview

这是什么意思?我如何解决它?因为它不指向问题来自的任何代码行。

+1

有同样的问题,我只是发现了这一点。它涉及你的数据库如何运行在错误的范围内。 http://groups.google.com/group/android-developers/browse_thread/thread/8bec793c626fb405 – Emile 2010-11-18 13:14:14

当处理ListActivities时,此问题与活动停止时Cursor对象,CursorAdapter对象和数据库对象未正确关闭有关,而且在活动启动或恢复时未正确设置。

我必须确保在TabActivity恢复时调用的Activity的onStop方法中,按照相应的顺序关闭我的SimpleListAdapter,我的Cursors,然后关闭我的Database对象。

我已经关闭了游标和数据库对象,但并没有关闭我的SimpleListAdapter游标。

/** 
    * onStop method 
    * 
    * Perform actions when the Activity is hidden from view 
    * 
    * @return void 
    * 
    */ 
    @Override 
    protected void onStop() { 
    try { 
     super.onStop(); 

     if (this.mySimpleListAdapterObj !=null){ 
     this.mySimpleListAdapterObj.getCursor().close(); 
     this.mySimpleListAdapterObj= null; 
     } 

     if (this.mActivityListCursorObj != null) { 
     this.mActivityListCursorObj.close(); 
     } 

     if (this.myDatabaseClassObj != null) { 
     this.myDatabaseClassObj.close(); 
     } 
    } catch (Exception error) { 
     /** Error Handler Code **/ 
    }// end try/catch (Exception error) 
    }// end onStop 
+2

我只是想感谢你,我只是花了太长时间在这个同样的问题上感到沮丧,你的是我阅读的唯一建议说以一定的顺序关闭事情,这是有效的。谢谢! – 2011-10-27 21:34:39

+2

你好。作为Android的新手,我刚刚在一个Workshop中学到了“onStop”不能保证被调用。他们说,最好在“onPause”上做那些事情。只是说 - 如果我错了,请纠正我。我总是愿意向有经验的人学习。 – Fildor 2011-11-22 08:43:53

+1

如果这个问题(这看起来相当重要!)有充分的文件记录,这个问题就不会出现。谢谢!我只希望在*之前我发现了这个*我浪费了无数个小时编写糟糕的代码。 – 2012-05-21 16:56:49

按照正确的顺序关闭游标,数据库,DBHelpers是非常重要的。

例如,下面给出的代码为 。

DBHelper dbhelper = new DBHelper(); 
SQLiteDataBase db = dbhelper.getWritableDatabase(); 

Cursor c = db.query(/*some parameters*/); 

收盘顺序应该是这样的:

c.close(); 
db.close(); 
dbhelper.close(); 

否则不同的错误继续产卵和开发商甚至不来认识一下它。 “光标:fillWindow()中的无效声明”是这样的错误之一。

+2

如果我从自定义游标适配器的方法(扩展cursoradapter)为我的列表活动返回游标,那该怎么处理 – 2013-02-05 06:09:35

如果您使用自定义Class实例,例如Model m持有一个DatabaseManager,进而持有SQLiteDatabase:型号 - > DatabaseManager-> SQLiteDatabase

然后,如果你做一个查询到m(它此时,相应的代表团),然后你像做m.close()(事实上,关闭SQLiteDatabase),然后你尝试使用光标,你会得到那个错误。

解决方法是:先使用光标,然后关闭Db。

我的回答是基于迄今为止存在的2个,这促使我解决了这个问题。

也许这可以帮助你:http://www.ragtag.info/2011/feb/1/database-pitfalls/

看来,调用getReadableDatabasegetWritableDatabase回报相同连接到数据库中(即使你多次打电话给他们)。 因此,任何致电close()的任何人都将关闭这两个连接。

如果您稍后尝试使用游标,您会得到很好的'无效语句',因为游标依赖的连接已关闭。

我仍然遇到'fillWindow()中的无效语句错误'错误。

我已经将问题缩小到我的ListView的SimpleCursorAdapter游标。

例如,如果我在活动A的列表视图中,并且在启动新的活动B之前关闭了光标,那么当我返回到活动A时,我没有在fillWindow()中获得'Invalid statement

但是,在活动B加载之前,我看到活动A的列表视图中的列表在屏幕上消失,并且在隐藏屏幕之前短暂显示“未找到记录”消息,然后显示活动B的屏幕。

我该如何优雅地解决此问题?编辑: 今天早上我其实已经想通了。我加

this.stopManagingCursor(this.myListCursor);

OnPause方法中在我的ListActivity类,这解决了“在fillWindow无效的声明()”的错误。

+0

我今天早上真的想到了这个。我将'this.stopManagingCursor(this.myListCursor)'添加到我的ListActivity类的onPause方法中,并解决了fillWindow()中的'Invalid statement'错误。 – Bryan 2012-12-14 16:52:59