完成一个尚未停用或closures非致命错误的游标

我得到一个“最终确定一个游标尚未停用或closures”​​错误在这段代码。 该代码用于填充一个列表视图。

由于这是一个非致命的错误,没有崩溃,似乎工作正常..但我不喜欢的错误。

如果我在这个代码的末尾closures游标。listview保持空。 如果我在onStopclosures游标,我得到相同的错误。

我该如何解决??

private void updateList() { DBAdapter db = new DBAdapter(this); db.open(); //load all waiting alarm mCursor=db.getTitles("state<2"); setListAdapter(new MyCursorAdapter(this, mCursor)); registerForContextMenu(getListView()); db.close(); } error : E/Cursor ( 2318): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/xxxxxxxxxxxxxxx.db, table = alerts, query = SELECT _id, alert_id, E/Cursor ( 2318): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here E/Cursor ( 2318): at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210) E/Cursor ( 2318): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java: 53) E/Cursor ( 2318): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java: 1345) E/Cursor ( 2318): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java: 1229) .... .... 

如果closuresonStop()onDestroy()Cursor ,则不应该得到该消息。 请再试一次。 或者,从查询中获得Cursor后,调用startManagingCursor() ,Android将自行closuresCursor

斯科特,

我遇到了和你一样的问题。 在closures数据库之前,比如“db.close()”,确保你的游标先closures,即“mCursor.close()”

像这样:

 private void updateList() { DBAdapter db = new DBAdapter(this); db.open(); //load all waiting alarm mCursor=db.getTitles("state<2"); setListAdapter(new MyCursorAdapter(this, mCursor)); registerForContextMenu(getListView()); // Let's close the cursor. mCursor.close(); db.close(); } 

你提到,如果你closures了你的光标,你的列表视图保持为空。 我build议你将这些信息传递给一个类并复制它(分配内存),然后closures游标。

当查询返回一个游标时,它实际上位于游标中第一个logging的“之前”。 一个适配器会尝试在第一个元素上做一个'getItem',所以它会失败,因为光标不在任何位置。

在我的基础适配器中,我在getViews上做了一个cursorMoveToPosition。 这似乎消除了movefirst的需要。

不要使用startManagingCursor(),因为这不再是推荐的方法。 发生该问题的原因是游标/数据库连接在终结器到达此对象时仍未closures。 您可以通过允许加载器来pipe理游标,或通过自己跟踪所有游标/ DB / SQLiteOpenHelper连接并清理它们来避免这种情况。

使用Loader非常麻烦,需要大量移动部件才能与列表视图一起工作。 另一方面,跟踪你的光标和数据库连接很容易出现人为错误。 如果光标/数据库对象的数量很less,我会推荐后者的解决scheme。 如果没有,让一个装载机处理你的连接。

closures光标对象,无论你在哪里创build它。

当你创build一个游标对象并遍历一个SQLite表时完成,然后在使用它之后closures它。 游标closures可以防止logcat中的exception。

你将不会得到任何与终止左侧打开的游标相关的exception。

这在我的应用程序中固定相同的问题

我为这个问题挣扎了两天。 我试图让示例代码工作传递游标,从数据库查询返回直接到列表适配器 – 没有临时适配器。 它拒绝工作 – 只是显示一个空白屏幕 – 直到我调用光标“moveToFirst()”,然后将其传递给ListAdapter。 去搞清楚! 当我评论这个,它打破了。

只是以为我会分享这个救人的斗争,我有同样的斗争。

如果有人能够说明为什么这样,我会很感激。 到目前为止,我还没有必要在游标上调用moveToFirst,以使它们正确执行。

只是有同样的问题,并想法让你知道 – 以防万一….

我无意中调用了我的抓取程序两次,因此“丢失”了第一次调用的结果光标。 这导致了错误。

我也一直在closures游标的问题:

  • 在设置列表视图的适配器之后closures光标会导致光标在数据显示之前closures。

  • 不能使用startManagingCursor来pipe理游标,因为它已被弃用。

  • startManagingCursor的新cursorLoader替代似乎是矫枉过正的。

  • 按照build议移动光标位置不起作用。

  • 使任务成为活动的内部类,并在活动的onDestroy方法中closures游标有时候并不总是有效。

  • 使任务成为活动的内部类,并closures活动的onStop方法中的游标似乎正在工作。

我也发现,我可以在closures游标之前closures数据库和sqlite打开助手。 我甚至可以在设置好列表视图的适配器后closures它们。 数据仍将显示。

startManagingCursor(光标);

这已经解决了我的问题