我要问这个返回光标的问题吗?

时间:2013-03-14 00:52:57

标签: java android cursor

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

我在光标上接收到两个空指针,并且“无法停止活动”错误。

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

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;

}

1 个答案:

答案 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}}