Android需要关闭游标,数据库,两者都没有?

时间:2016-06-01 00:47:56

标签: android database multithreading sqlite cursor

我正在寻找一些解决方案来解决我的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)也有很多开源项目。我为社区做了很多事情,但今天是我需要的。

1 个答案:

答案 0 :(得分:2)

是的,您需要关闭游标。一种方法是将所有查询包装在try / finally语句中。

Cursor c = null;
try {
    c = db.query(...)
} finally {
    if (c != null) {
        c.close();
    }
}

如果您正在使用CursorLoaders(我强烈推荐),那么您不需要关闭游标,因为Loader框架会为您管理它。