完成尚未停用或关闭非致命错误的游标

arn*_*old 33 android cursor

我正在获得这段代码的"完成一个尚未停用或关闭的光标"错误.该代码用于填充列表视图.

因为它是一个非致命的错误,没有崩溃,所有似乎都工作正常..但我不喜欢错误.

如果我关闭此代码末尾的光标......列表视图保持空白.如果我在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) 
.... 
.... 
Run Code Online (Sandbox Code Playgroud)

Com*_*are 27

如果你关闭Cursorin onStop()或者,你不应该收到该消息onDestroy().请再试一次.或者,从您的查询中startManagingCursor()获取后调用Cursor,Android将Cursor自行关闭.

  • 不推荐使用startManagingCursor(Cursor):"将新的CursorLoader类与LoaderManager一起使用." (11认同)
  • 我知道这是一个老线程,但没有人说明显.他正在创建一个游标,然后立即关闭数据库而不关闭游标.在示例代码中的db.close()之前的cursor.close()应解决该问题.这就是创建活动时发生的原因. (9认同)
  • @arnold:也许你在想错误的'光标'?没有理由为什么你会在"活动开始后"得到那条消息,所以我想也许你正在从之前的活动中泄漏一个"光标"或什么东西. (2认同)
  • 使用try catch并在finally块中编写代码cursor.close()和cursor.deactivate(); //只有当你想在稍后阶段查询存储时,否则cursor.close()就足够了.(cursor == null)也将解决问题 (2认同)

小智 13

斯科特,

我遇到了和你一样的问题.在关闭数据库之前,即"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(); 
} 
Run Code Online (Sandbox Code Playgroud)

您提到如果关闭光标,列表视图将保持为空.我建议你将信息传递给一个类并复制它(分配内存)然后关闭光标.