1

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

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

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

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() { String[] columns = new String[] { 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;

}
4

1 回答 1

1

您应该能够执行以下操作

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

这样做的原因是,该query()方法不会返回 null。它只会返回一个空游标。因此,无需检查其是否为空。此外,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(); 
}
于 2013-03-14T01:12:09.087 回答