19

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

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

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

4

4 回答 4

25

您必须在数据库之前关闭游标。将代码放在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 时,关闭顺序很重要。有关更多信息,请参阅此链接

于 2012-05-03T15:27:15.923 回答
11

要查找此类问题,只需为调试版本启用 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

一切顺利,

于 2015-04-24T11:39:35.373 回答
4

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

于 2012-10-11T13:43:37.450 回答
0

让活动通过使用管理游标生命周期,startManagingCursor(c)就可以了。

于 2012-05-03T15:27:57.483 回答