sqlite删除最后一行刷新不起作用

时间:2011-02-25 20:09:17

标签: android sqlite

我的listview上有一个长按选项,它将删除长按数据库条目。删除确实有效。如果我从应用程序中退出并返回,我会收到我的“无行”消息。完美。

在我的代码中,我首先调用DBadapter方法来删除一行。然后我在dbadapter中调用fetchallnotes方法来刷新listview。然而,最后一行不会在此fetchallnotes调用中消失..仅在我的onCreate上的fetchallnotes调用中。

这是我的上下文菜单调用,它调用我的DBAdapter方法

db.deleteNote(info.id);
getSnapz();

这是我在DBAdapter中的deleteNote方法

public boolean deleteNote(long rowId) {
     return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}

这是我的getSnapz方法,它位于我的主要活动中,这是我的listview

public void getSnapz(){
    try {
        Cursor c = db.fetchAllNotes();
        //requery cursor incase the last entry has been deleted
        c.requery();
        startManagingCursor(c);
        if(c.moveToFirst()){

        String[] from = new String[]{DBAdapter.KEY_TYPE,DBAdapter.KEY_WEIGHT,DBAdapter.KEY_DATE,DBAdapter.KEY_PLACE};
        int[] to = new int[]{R.id.typecol,R.id.weightcol,R.id.datecol,R.id.placecol};

        SimpleCursorAdapter simple = new SimpleCursorAdapter(this, R.layout.snapz_row, c, from, to);
        setListAdapter(simple);
        }

    } catch (Exception e) {
        Log.e(TAG,e.toString());
    }
}

这是我在DBAdapter中的fetchAllNotes方法

public Cursor fetchAllNotes() throws Exception{
    Cursor c = db.query(DATABASE_TABLE, new String[] {KEY_ROWID,KEY_URI, KEY_DATE,KEY_TYPE,KEY_WEIGHT,
            KEY_PLACE}, 
            null, null, null, null, null );

    return c;
}

1 个答案:

答案 0 :(得分:0)

删除最后一行后,返回的光标为空。因此,c.moveToFirst()返回false,跳过整个if块,并且列表视图保持不变,仍显示刚刚删除的行。

当您删除多行中的一行时,它会起作用,因为只要还有另一行仍然存在,moveToFirst()就会返回成功。

当您退出并恢复时它会起作用,因为此时重新创建了活动并且列表视图开始未初始化。

解决方案:完全删除if语句。 SimpleCursorAdapter应该对带有0行的游标感到满意。

长期更好的是,迁移到ContentProvider并使用ContentObserver模型确保您的游标在它们反映的数据库发生更改时自行更新。