我正在寻找一些解决方案来解决我的sqlite和android问题。我读了很多关于sqlite和android的文章。我看到有人说你需要关闭CURSOR,有些人说你需要关闭DATABASE,还有其他你需要关闭的东西,以及其他你不需要关闭的东西,因为有一个Android工程帖子。
在我的应用中,我们对sqlite的使用太多了。
1 - 我们存储要同步的东西。 2 - 我们在后台添加/删除内容。 3 - 我们有+/- 10个后台服务,由Alarm Manager启动以同步某些事情。
一切都在同一时间运行,多线程以及更多。
当我收到应用程序时,我们会在关闭游标/数据库的同时打开其他游标时遇到很多很多错误。很多困惑。
所以,阅读后,谷歌工程师的帖子(我不记得谷歌组),你不需要关闭sqlite光标或数据库的答案(我不记得,我不知道是否有所作为)。
所以现在在我的后台服务中同步事情,我得到错误:
Fatal Exception: android.database.CursorWindowAllocationException
Cursor window allocation of 2048 kb failed. # Open Cursors=593 (# cursors opened by this proc=593)
那么我需要做什么?什么是正确的方法?什么适用于很多线程和IntentServices使用它?
我今天的示例代码:
public static MyInternalObject getFirstAudience() {
SQLiteDatabase db = UbookProvider.getInstance().getReadableDatabase();
String sql = "SELECT * FROM " + UbookContract.MyInternalObject.TABLE_NAME + " LIMIT 1";
Cursor cursor = db.rawQuery(sql, null);
if (cursor != null) {
if (cursor.getCount() > 0) {
cursor.moveToFirst();
do {
return MyInternalObjectService.createFromCursor(cursor);
} while (cursor.moveToNext());
}
}
return null;
}
我天黑了,我不知道用它来解决我在android中的数据库问题的好方法。
任何人都可以帮助我?
我的github(github.com/prsolucoes)也有很多开源项目。我为社区做了很多事情,但今天是我需要的。
答案 0 :(得分:2)
是的,您需要关闭游标。一种方法是将所有查询包装在try / finally语句中。
Cursor c = null;
try {
c = db.query(...)
} finally {
if (c != null) {
c.close();
}
}
如果您正在使用CursorLoaders(我强烈推荐),那么您不需要关闭游标,因为Loader框架会为您管理它。