在我的应用程序中,我有一个列表视图。我通过 SQLiteDatabase 的查询获取数据。当我从数据库中获取数据时,我收到此错误:
它发生在我从第 20 行到第 21 行时。
我尝试将 cursor.deactivate() 和 cursor.close() 放在 regel 50 上。但没有结果。任何人都知道我为什么会收到此错误以及如何解决它?谢谢 :)
在我的应用程序中,我有一个列表视图。我通过 SQLiteDatabase 的查询获取数据。当我从数据库中获取数据时,我收到此错误:
它发生在我从第 20 行到第 21 行时。
我尝试将 cursor.deactivate() 和 cursor.close() 放在 regel 50 上。但没有结果。任何人都知道我为什么会收到此错误以及如何解决它?谢谢 :)
您必须在数据库之前关闭游标。将代码放在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 时,关闭顺序很重要。有关更多信息,请参阅此链接
要查找此类问题,只需为调试版本启用 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
一切顺利,
始终,请记住在关闭数据库之前通过调用 cursor.close() 来关闭游标。那应该可以解决您的问题。
让活动通过使用管理游标生命周期,startManagingCursor(c)
就可以了。