基本上我有一个方法可以从我的数据库中填充列表视图。
我在光标上接收到两个空指针,并且“无法停止活动”错误。
这就是我返回光标的方式:
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 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) {
c.moveToFirst();
}
c.close();
return c;
}
答案 0 :(得分:1)
您应该可以执行以下操作
if (c.moveToFirst()){
return c;
}
原因是query()
方法不会返回null。它只会返回一个空光标。所以,没有必要检查它是否为null。此外,如果moveToFirst()
无法移动到第一行(因此,如果光标为空),则close()
的计算结果为false。因此,计数检查是多余的。
但是,您确定从方法中返回null是否安全?如果没有结果,则表示返回null。另外,您是否知道返回后永远不会调用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());
}
,它不关闭光标,只返回它。现在构建这样的游标适配器
@Override
public void onDestroy() {
myCursorAdapter.getCursor().close();
}
现在,将游标适配器传递给ListView,在此阶段,ListView可以使用底层游标(因为它仍然存在,如在,未关闭:P)。然后,当您确定您的应用程序不再需要光标时,请将其关闭。当你的活动被销毁时,我建议你这样做
{{1}}