Android HoneyComb - Requering已关闭游标

时间:2012-12-07 00:15:04

标签: android sqlite sqliteopenhelper android-cursor android-cursorloader

我读了很多关于这个问题的问题,但我找不到正确的方向来解决我的问题,也许是因为我是菜鸟,并且感到绝望,找不到正确的方法......

据我所知,自“HoneyComb”以来,“请求已关闭的游标”问题发生,因为startManagingCursor已被弃用。从HoneyComb开始,我们应该使用与CursorLoader一起使用的ContentProvider(我不使用,我不想这样做),并发现有人写了一个类来使用CursorLoader没有ContentProviderhere)。

在我的应用程序中,我有一个mySQLiteHelper类,我有很多方法可以从SQLite中检索数据,如下所示:

    public Cursor listaBeneficios(String id) {
    String where = "proposta=?";
    String[] whereArgs = {id};
    String[] campos = {"pessoa"};
    Cursor c = db.query(TABLE_BENEFICIOS, campos, where, whereArgs, null, null, null, null);
    if (c.moveToFirst()) {
        return c;
    } else {
        return null;
    }
}

在我的Activity上,我可以读取这样的数据:

    db = new repositorio(MainActivity.this);
    Cursor c = db.listaBeneficios(PROPOSTA);
    startManagingCursor(c);
    address.setText(c.getString(c.getColumnIndex("address")));
    db.close();

但是我注意到每当我点击后退按钮并返回活动A时,它就会给臭名昭着的“试图重新查询已经关闭的游标”。 我已经尝试停止ManagingCursor和close()而不是使用startManagingCursor。 这让我疯了。

是否有使用CursorLoaders的简单示例? 如果我实现CursorLoaders,我能继续使用上面的方法(即上面的listaBeneficios())吗? 这class对我有帮助吗?我该如何实现呢?

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

CursorLoader不起作用,因为它需要内容URI。但是,您始终可以使用LoaderAsyncTaskLoader。这些类的documentation包含如何使用它们的示例。

答案 1 :(得分:0)

在我的情况下,我使用managedQuery将光标从ContentProvider返回到我的活动。我只是将调用更改为getContentResolver()。查询和问题已解决。

在Eclipse中执行Control H以替换所需的所有更改。