sqlite удалить последнее обновление строки не работает - PullRequest
0 голосов
/ 25 февраля 2011

У меня есть опция длинного нажатия в моем списке просмотра, которая удалит запись в долго нажатой базе данных.Удаление действительно работает.Если я выхожу из приложения и возвращаюсь, мне выдается сообщение «нет строк».Идеальный.

В моем коде я сначала вызываю метод DBadapter для удаления строки.Затем я вызываю метод fetchallnotes в dbadapter, чтобы обновить мой список.Однако последняя строка не исчезнет при этом вызове fetchallnotes. Только при вызове fetchallnotes в моем onCreate.

Вот мой вызов контекстного меню, который вызывает мой метод DBAdapter

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

Это мой метод deleteNote в DBAdapter

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

, здесь мой метод getSnapz, который находится в моей основной деятельности, где мой просмотр списка

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

А вот мой метод fetchAllNotesв DBAdapter

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 голосов
/ 25 февраля 2011

После удаления последней строки возвращаемый курсор пуст.Поэтому c.moveToFirst () возвращает false, весь блок if пропускается, а ваш список просмотра остается неизменным, все еще показывая только что удаленную строку.

Это работает, когда вы удаляете одну из нескольких строк, потому что moveToFirst ()возвращает успех, если осталась еще одна строка.

Работает при выходе и возобновлении, потому что в этот момент действие воссоздается и просмотр списка начинается неинициализированным.

Решение: полностью исключить оператор if.SimpleCursorAdapter должен быть доволен курсором с 0 строками.

Еще лучше в долгосрочной перспективе, выполнить миграцию на ContentProvider и использовать модель ContentObserver, чтобы убедиться, что ваши курсоры обновляются, когда база данных, которую они отражают, меняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...