gpt4 book ai didi

java - 我是在问这个返回的游标的问题吗?

转载 作者:行者123 更新时间:2023-11-30 03:43:26 25 4
gpt4 key购买 nike

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

我在游标上收到空指针和“无法停止 Activity ”错误。

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

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;
}

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

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

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

新编辑:

公共(public)游标 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;

}

最佳答案

你应该能够做到以下几点

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 可以使用底层游标(因为它仍然存在,没有关闭 :P)。然后,当您确定您的应用程序不再需要光标时,关闭它。我建议在您的 Activity 被销毁时执行此操作

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

关于java - 我是在问这个返回的游标的问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15399321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com