Android 终结尚未停用或关闭的游标非致命错误

Android 终结尚未停用或关闭的游标非致命错误,android,cursor,Android,Cursor,我得到一个“完成一个未被停用或禁用的游标” 这段代码上的“closed”错误。 该代码用于填充列表视图 因为这是一个非致命错误,所以没有崩溃,而且一切似乎都正常 很好,但是我不喜欢这个错误 如果我在代码末尾关闭光标,listview将保持 空的。 如果在onStop中关闭光标,则会出现相同的错误 我该如何解决这个问题 private void updateList() { DBAdapter db = new DBAdapter(this); db.open(

我得到一个“完成一个未被停用或禁用的游标” 这段代码上的“closed”错误。 该代码用于填充列表视图

因为这是一个非致命错误,所以没有崩溃,而且一切似乎都正常 很好,但是我不喜欢这个错误

如果我在代码末尾关闭光标,listview将保持 空的。 如果在onStop中关闭光标,则会出现相同的错误

我该如何解决这个问题

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(SQLiteDirectCursorDr­iver.java: 
53) 
E/Cursor  ( 2318):      at 
android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.j­ava: 
1345) 
E/Cursor  ( 2318):      at 
android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java­: 
1229) 
.... 
.... 
private void updateList(){
DBAdapter db=新的DBAdapter(此);
db.open();
//加载所有等待报警

mCursor=db.getTitles(“state如果在
onStop()
onDestroy()
中关闭
光标,则不应收到该消息。请重试。或者,调用
startManagingCursor()
从查询中获取
光标后,Android将自行关闭
光标。

Scott

我遇到了与您相同的问题。在关闭数据库(即“db.close()”)之前,请确保首先关闭游标,即“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(); 
} 
private void updateList()
{ 
DBAdapter db=新的DBAdapter(此);
db.open();
//加载所有等待报警

mCursor=db.getTitles(“state我为这个问题挣扎了两天。我试图让示例代码工作,它通过一个游标,从数据库查询返回,直接传递到列表适配器-没有临时适配器。它拒绝工作-只是显示一个空白屏幕-直到我调用'moveToFirst())'在将其传递给ListAdapter之前,在光标上单击。如图所示!当我将其注释掉时,它将中断

我只是想和大家分享这一点,以拯救那些和我一样挣扎的人们


如果有人能解释为什么会这样,我将不胜感激。到目前为止,我还没有在游标上调用moveToFirst来让它们正常运行。

当查询返回游标时,它实际上位于第一个游标之前 游标中的记录。适配器将尝试在第一次执行“getItem” 元素,因此它将失败,因为光标未定位在任何位置

在我的基本适配器中,我在GetView上做了一个cursorMoveToPosition
先不需要搬家。

也有同样的问题,想让你知道-以防万一


我意外地调用了我的获取例程两次,并因此“丢失”了第一次调用的结果游标。这导致了错误。

我在关闭游标时也遇到了问题:

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

  • 无法使用startManagingCursor管理光标,因为它已被弃用

  • 用新的游标装入器替换StartMagingCursor似乎有些过分了

  • 按建议移动光标的位置无效

  • 使任务成为活动的内部类并在活动的onDestroy方法中关闭光标有时有效,但并非始终有效

  • 使任务成为活动的内部类并在活动的onStop方法中关闭光标似乎是可行的

我还发现,我可以在关闭游标之前关闭数据库和sqlite open helper。我甚至可以在设置列表视图的适配器之后立即关闭它们。数据仍将显示。

开始管理游标(游标)


这已经解决了我的问题

不要使用startManagingCursor()因为这不再是推荐的方法。出现此问题的原因是,在终结器访问此对象时,游标/DB连接仍未关闭。您可以通过允许加载程序管理游标或自己跟踪所有游标/DB/SQLiteOpenHelper连接并在它们之后进行清理来避免此问题


使用加载器相当麻烦,需要很多移动部件才能与列表视图一起工作。另一方面,跟踪光标和数据库连接容易出现人为错误。如果光标/DB对象的数量较少,我建议采用后一种解决方案。如果没有,让加载器处理您的连接。

Cl无论在何处创建光标对象,都将其锁定

创建游标对象并遍历SQLite表时,请在使用该对象后将其关闭。关闭游标可防止logcat中出现异常

您将不会得到任何与结束保持打开状态的游标相关的异常


这修复了我的应用程序中的同一问题。

谢谢-StartManagInResor(mCursor)-修复了它…错误总是在活动开始后发生..因此在出现错误之前甚至不会调用closing in-Stop。谢谢。@arnold:也许你想的是错误的
光标
?你没有理由收到该消息“就在活动开始之后”,所以我想可能是您从上一个活动中泄漏了一个
游标
。请使用try-catch并在finally中阻止write-code-Cursor.close()和Cursor.deactivate();//仅当您想在稍后阶段查询存储时,否则Cursor.close()就足够了。(Cursor==null)还将解决问题StartManagingCursor(Cursor)被弃用:“将新的CursorLoader类与LoaderManager一起使用。”我知道这是一个旧线程,但没有人明确说明这一点。他正在创建一个光标,然后立即关闭数据库,而不关闭光标。Cursor.close()就在db.close()之前在示例中,代码应该解决这个问题。这就是为什么在创建活动时会发生这种情况。只是为@birdman添加了一个想法:您的游标可能以前工作过,尤其是在使用while(moveToNext)时。由于光标在第一条记录之前返回,因此moveToNext有效。您应该使用startManagingCursor,否则您必须处理