【问题标题】:Cursor finalized without prior close() Android光标在没有事先 close() Android 的情况下完成
【发布时间】:2012-05-03 15:19:14
【问题描述】:

在我的应用程序中,我有一个列表视图。我通过 SQLiteDatabase 的查询获取数据。当我从数据库中获取数据时,我收到此错误:

它发生在我从第 20 行到第 21 行时。

我尝试将 cursor.deactivate() 和 cursor.close() 放在 regel 50 上。但没有结果。任何人都知道我为什么会收到此错误以及如何解决它?谢谢:)

【问题讨论】:

  • 与答案无关。您应该调用 getReadableDatabase() 而不是 getWriteableDatabase()。当您所做的只是读取它时,无需获取可写的 db 对象。
  • @thinksteep 我看到了这个问题,但是当我尝试解决方案时它不起作用。感谢您的帮助

标签: android sqlite sqliteopenhelper


【解决方案1】:

你必须在数据库之前关闭游标。将您的代码放入try / catch 块和finally 块中,关闭游标,然后关闭数据库:

try {
    db = ...
} catch(Exception ex) { 
    // Log the exception's message or whatever you like
} finally {
    try {
      if( cursor != null && !cursor.isClosed())
        cursor.close();
       if( db.isOpen() )
        db.close();
    } catch(Exception ex) {}
}

在使用 DB 或 Content Provider 进行 IO 时,关闭顺序非常重要。 更多信息请参考this link

【讨论】:

  • 我有两台设备,一台 HTC Desire 和一台三星 Galaxy Nexus。与欲望我没有得到错误。我喜欢 Galaxy Nexus。
【解决方案2】:

要查找此类问题,只需为调试版本启用 StrictMode:

public void onCreate() {
     if (DEVELOPER_MODE) {
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                 .detectDiskReads()
                 .detectDiskWrites()
                 .detectNetwork()   // or .detectAll() for all detectable problems
                 .penaltyLog()
                 .build());
         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                 .detectLeakedSqlLiteObjects()
                 .detectLeakedClosableObjects()
                 .penaltyLog()
                 .penaltyDeath()
                 .build());
     }
     super.onCreate();
 }

更多信息@ http://developer.android.com/reference/android/os/StrictMode.html

一切顺利,

【讨论】:

    【解决方案3】:

    始终记得在关闭数据库之前通过调用 cursor.close() 来关闭游标。这应该可以解决您的问题。

    【讨论】:

      【解决方案4】:

      让activity使用startManagingCursor(c)来管理游标生命周期就可以了。

      【讨论】:

      • 我在哪里写这个?因为在我的 DatabaseAdapter 类(扩展 SQLiteOpenHelper)中,他没有找到“startmanagingcursor()”
      • 它是 Activity 的一种方法。例如,您从 DBAdapter 获取光标并将其设置为 Activity 内的列表视图。在 Activity 内部,调用 startManagingCursor(c),然后再调用 setAdapter()。 .;
      • 我使用 ArrayAdapter。所以我不返回光标而是返回一个数组。我需要如何使用 arrayadapter 来解决它?
      • 是的,当然有光标。但是我使用的游标在 DatabaseAdapter 类中(具有从数据库中获取/添加/删除数据的所有方法的类)。我使用 ArrayAdapter 来填充我的 ListView。因此,我使用游标从数据库中获取数据并将其放入我返回并提供给 ArrayAdapter 的数组列表中。所以 ArrayAdapter 中没有光标
      • 只要说出你的代码;所以在你的情况下,就在 db.close() 之前调用 cursor.close() 就是这样。所以代码序列是 cursor.close();游标=空; db.close();
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多