2010-07-22 71 views
1

我有一個列表視圖,它由SimpleCursorAdapter填充,它將數據綁定到來自sqlite數據庫的遊標視圖。我想要一個上下文菜單選項來刪除一個列表項,當它被長時間按下時,所以我通過調用registerForContextMenu(historyListView)來註冊一個上下文菜單的ListView。我試圖通過在OnCreateContextMenu中獲取行標識並將其存儲爲專用字段lastSelectedId來刪除數據庫中的行,然後如果在OnContextItemSelected中選擇刪除上下文項,請通過檢查_id列對lastSelectedId從列表視圖中使用_id列從上下文菜單中刪除行

這不起作用。

所以 - (1)在該行由

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo; 
     lastSelectedId = info.id; 

一樣在數據庫中的_id欄中給出?

和(2.)如果不是,我該如何刪除基於數據庫中該行的_idonContextItemSelected()中的項目?

編輯:很抱歉沒有解釋爲什麼這種方法是行不通的更深入:什麼情況是,當我嘗試刪除該行沒有任何反應:我叫mDB.delete(DB_TABLENAME,"_id=" + lastSelectedId, null);數據庫,然後我打電話bookmarksListAdapter.notifyDataSetChanged();SimpleCursorAdapter 。然後我發現listview中的條目沒有變化,這與我預期的行爲不同,我調用remove的行將消失。

回答

0

想通了。我需要在數據庫更改後重新執行光標(出於某種原因,我以爲這會自動完成 - 我的錯誤)bookmarksDbCursor.requery()修復了我的問題。

0

當你說它不工作,什麼不工作?它是否不刪除條目?它不顯示更新的列表嗎?你如何刪除該行?你能分享更多的代碼嗎?

通常,id一般是數據庫的_id(如果使用標準約定)。您是否使用自己的內容提供商?您需要通知系統數據庫已更改,以便可以重新查詢 - 通常在您遵循SDK中的ContentProvider示例(查看notifyChange)時以及是否使用託管查詢時,通常會執行此操作。

+0

「id一般是數據庫的_id」 謝謝 - 這會縮小問題的範圍。我已經編輯了我的帖子,以更具體地說明我正在做什麼來刪除該行,但我仍然不確定該條目是否從數據庫中刪除。我一定知道這個清單根本沒有更新。 – QRohlf 2010-07-23 16:13:12

+0

你可以用sqlite3來查看你的數據庫 - 如果在手機上,使用adb shell,去數據庫所在的位置(/ data/data/your_app/databases),並用「sqlite3」調用它,並使用.dump來獲得完整的內容。然後,在刪除之前添加一個Log.d()以打印出lastSelectedId以查看您實際嘗試刪除的ID。 – EboMike 2010-07-23 17:46:22