Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android sqlite删除最后一行刷新不工作_Android_Sqlite - Fatal编程技术网

Android sqlite删除最后一行刷新不工作

Android sqlite删除最后一行刷新不工作,android,sqlite,Android,Sqlite,我的listview上有一个长按选项,它将删除长按的db条目。删除确实有效。如果我退出应用程序并返回,我会收到“无行”消息。太好了 在我的代码中,我首先调用DBadapter方法来删除一行。然后,我在dbadapter中调用fetchallnotes方法来刷新我的listview。但是,在这次fetchallnotes调用中,最后一行不会消失。。仅在onCreate中的fetchallnotes调用上 这是我的上下文菜单调用,它调用我的DBAdapter方法 db.deleteNote(info

我的listview上有一个长按选项,它将删除长按的db条目。删除确实有效。如果我退出应用程序并返回,我会收到“无行”消息。太好了

在我的代码中,我首先调用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;
}
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;
}
这是我的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 boolean deleteNote(long rowId) {
     return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}
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;
}

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

当您删除几行中的一行时,它会起作用,因为只要还有一行,moveToFirst()就会返回成功

它在退出并继续时工作,因为此时将重新创建活动,而listview未初始化

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


从长远来看,更好的方法是迁移到ContentProvider,并使用ContentObserver模型来确保您的游标在数据库反映更改时自动更新。

另外,我认为您的requery()调用是不必要的——在您调用db.fetchAllNotes()之前,行已经消失了。谢谢您,伙计。非常感谢你的建议!