【问题标题】:Am I asking for issues with this returned cursor?我是在询问这个返回的光标的问题吗?
【发布时间】:2013-03-14 00:52:56
【问题描述】:

基本上我有一个方法可以从我的数据库中填充一个列表视图。

我同时收到光标上的空指针和“无法停止活动”错误。

这就是我返回光标的方式:

public Cursor getAppointmentsData() {
    String[] columns = new String[] { KEY_ROWAPPID, KEY_NAMEAPP,
            KEY_TYPEAPP, KEY_TIMEAPP, KEY_DATEAPP, KEY_COMMENTAPP };
    Cursor c = ourDatabase.query(DATABASE_TABLEAPP, columns, null, null,
            null, null, KEY_NAMEAPP + " ASC", null);

    if (c != null) {
        if (c.getCount() > 0 && c.moveToFirst())

        {
            c.moveToFirst();

            return c;

        }

    }
    c.close();
    return null;
}

当数据库为空即没有数据时,它会崩溃...如果有数据就可以了。这让我相信我正在从光标返回一个空值。

你们能看出这种返回光标方法的问题吗?

很抱歉这个简单的问题,但在我拆开代码之前,我想我会在这里问。

新编辑:

公共游标 getAppointmentsData() { 字符串 [] 列 = 新字符串 [] { KEY_ROWAPPID, KEY_NAMEAPP, KEY_TYPEAPP, KEY_TIMEAPP, KEY_DATEAPP, KEY_COMMENTAPP }; 光标 c = ourDatabase.query(DATABASE_TABLEAPP, columns, null, null, null, null, KEY_NAMEAPP + "ASC", null);

    if (c != null) {

            c.moveToFirst();

        }
    c.close();
    return c;

}

【问题讨论】:

    标签: java android cursor


    【解决方案1】:

    您应该能够执行以下操作

    if (c.moveToFirst()){
        return c;
    }
    

    原因是query() 方法不会返回空值。它只会返回一个空游标。因此,无需检查其是否为空。此外,如果 moveToFirst() 无法移动到第一行(因此,如果光标为空),则其评估结果为 false。所以,计数检查是多余的。

    但是,您确定从您的方法返回 null 是安全的吗?如果没有结果,您将明确返回 null。另外,你知道close() 方法在返回后永远不会被调用(如果你有一个带结果的游标)。

    我不完全知道你对返回我的方法的光标做了什么,但我建议你只是简单地返回它。但我怀疑你想要的只是

    public Cursor getAppointmentsData() {
        String[] columns = new String[] { KEY_ROWAPPID, KEY_NAMEAPP,
                KEY_TYPEAPP, KEY_TIMEAPP, KEY_DATEAPP, KEY_COMMENTAPP };
        return ourDatabase.query(DATABASE_TABLEAPP, columns, null, null,
                null, null, KEY_NAMEAPP + " ASC", null);
    }
    

    更新 - 关于何时关闭光标

    如果关闭游标,在返回之前,方法getAppointmentsData() 将返回一个关闭的游标。我很确定这不是你想要的。由于在这个阶段,您还没有完成光标,所以自己清理还为时过早:)

    你所追求的是这样的。首先,使用我上面建议的方法getAppointmentsData(),它不会关闭光标,它只是返回它。现在构建你的光标适配器像这样

    public CursorAdapter myCursorAdapter;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        //... all your stuff
        myCursorAdapter = new CursorAdapter(this, getAppointmentsData());
    }
    

    现在,将光标适配器传递给您的 ListView,在这个阶段,ListView 可以使用底层光标(因为它仍然存在,如 in,未关闭:P)。然后,当您确定您的应用程序不再需要光标时,将其关闭。我建议在您的活动被破坏时这样做

    @Override
    public void onDestroy() {
       myCursorAdapter.getCursor().close(); 
    }
    

    【讨论】:

    • 这是一个很好的解释。老实说,我不知道如果没有触发“if”状态,只会返回一个空游标。当我在方法的底部有返回类型“null”时,我知道我正在走向麻烦。我将实施这一点,看看我是怎么做的。我在调用此游标方法的类中打开和关闭数据库。
    • 通过 c.close() 关闭我的光标仍然需要正确吗?
    • 是的,完成后关闭它。不是在 return 之后,因为 return 之后没有任何东西被评估(而且,你显然在这个阶段还没有完成实例。如果你在哪里,你不会从方法中返回它:))
    • 再次感谢您的回答。我已将我的新方法添加到我的原始问题中。如果可以,请检查一下,那就太好了。我在返回光标之前添加了光标关闭对象。
    • 我将在我的答案中添加另一个部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    相关资源
    最近更新 更多