2011-02-25 13 views
0

私は長い押したオプションを持っています。削除は実際に機能します。私がアプリから出て戻ってきたら、私の「いいえの行」のメッセージが表示されます。完璧。sqlite最後の行の更新が無効になっています

私のコードでは、最初に行を削除するDBadapterメソッドを呼び出します。次に、dbadapterのfetchallnotesメソッドを呼び出してリストビューを更新します。しかし、最後の行は、このfetchallnotes呼び出しでは消えません。fetchallnotes呼び出しでのみonCreateが呼び出されます。ここで

は私のDBAdapter方法

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

を呼び出して、私のコンテキストメニューの呼び出しは、ここでDBAdapter

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

でこの私の私のdeleteNote方法がある私のメインの活動である私の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メソッドはDBAdaですpter

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

答えて

0

最後の行を削除すると、返されるカーソルは空になります。したがって、c.moveToFirst()はfalseを返します。ブロック全体がスキップされ、listviewは変更されずにそのまま残された行が表示されます。

moveToFirst()は、まだ別の行が残っている限り、成功を返すため、複数の行のうちの1つを削除すると機能します。

アクティビティが再作成され、リストビューが初期化されずに終了するため、終了して再開すると機能します。

解決策: if文を完全に削除してください。 SimpleCursorAdapterは0行のカーソルに満足しているはずです。

ContentProviderに移行し、ContentObserverモデルを使用して、反映されたデータベースに変更が反映されたときにカーソルが確実に更新されるようにしてください。

+0

また、あなたのrequery()呼び出しは不要だと思います.db.fetchAllNotes()を呼び出す前に行が既に消えてしまっています。 – jcwenger

+0

ありがとうございました。あなたのアドバイスは非常に高く評価されています! – Stephen

関連する問題