1 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
理想情況下,您將在視圖中可檢索的地方使用主鍵(或者反之亦然,使用已在可檢索的地方使用的值作為主鍵)。由于這里的主鍵是一個(gè)auto_increment
字段,因此它與您嘗試刪除的視圖之間沒(méi)有真正可靠的關(guān)聯(lián)(至少?gòu)奈以谀拇a中看到的)。一種方法是Adapter
為您的列表使用自定義項(xiàng),而不是ArrayAdapter
, 并使用View.setTag()
和View.getTag()
方法來(lái)存儲(chǔ)列表中每個(gè)項(xiàng)目的主鍵。
假設(shè)您的activity_listitem
布局有一個(gè)TextView
with id?text_view
,您在其中顯示從數(shù)據(jù)庫(kù)獲取的文本,并且您已添加存儲(chǔ)主鍵的標(biāo)簽,您可以在主活動(dòng)中執(zhí)行以下操作:
? ? listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
? ? ? ? @Override
? ? ? ? public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
? ? ? ? ? ? TextView textView = (TextView) view.findViewById(R.id.text_view);
? ? ? ? ? ? final Integer which_item = (Integer) textView.getTag();? ? //Assuming you stored the ID as an Integer
? ? ? ? ? ? int rowsDeleted = bookmarksDB.deleteSpecificContent(which_item);
? ? ? ? ? ? if(rowsDeleted == 0){? //should be 1, since we're deleting by Primary Key
? ? ? ? ? ? ? ? //if you would like like, handle if nothing was deleted
? ? ? ? ? ? }
? ? ? ? ? ? return true;
? ? ? ? }
? ? });
在您的 BookmarksDatabase 類(lèi)中:
? ? public int deleteSpecificContents(int id) {
? ? ? ? SQLiteDatabase db = this.getWritableDatabase();
? ? ? ? return db.delete(TABLE_NAME, COL1 + "=?", new String[]{Integer.toString(id)});
? ? }
如果您不想使用自定義Adapter,另一種方法是使用列表中的位置來(lái)確定要?jiǎng)h除的項(xiàng)目。您可以通過(guò)查詢(xún)數(shù)據(jù)庫(kù)并迭代Cursor直到它與列表中項(xiàng)目的位置匹配來(lái)完成此操作。
? ? listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
? ? ? ? @Override
? ? ? ? public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
? ? ? ? ? ? Cursor data = bookmarkDB.getListContents();
? ? ? ? ? ? int i = 0;
? ? ? ? ? ? while(data.moveToNext()){
? ? ? ? ? ? ? ? if(i == position){
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? i++;
? ? ? ? ? ? }
? ? ? ? ? ? int rowsDeleted = bookmarkDB.deleteSpecificContent(data.getInt(0));
? ? ? ? ? ? //again, handle if rowsDeleted != 1 if you want
? ? ? ? ? ? return true;
? ? ? ? }
? ? });
您的BookmarkDatabase.deleteSpecificContent()方法與第一種方法完全相同 - 唯一的區(qū)別在于如何確定要?jiǎng)h除的項(xiàng)目的 id。如果您不想處理deleteSpecificContent()不返回 1 的情況(除非我在這里遺漏了一些主要內(nèi)容,否則在您的用例中它應(yīng)該始終返回 1),請(qǐng)隨意將其簽名更改為void, 而不是int。
請(qǐng)注意,第二種方法比第一種方法更昂貴,因?yàn)樗枰~外的數(shù)據(jù)庫(kù)查詢(xún),并且可能會(huì)迭代很多Cursor。雖然它需要更少的新/更改的代碼,但可能不建議使用(老實(shí)說(shuō)我不能肯定地說(shuō)。這可能適合您的用例,具體取決于您的數(shù)據(jù)庫(kù)的大小,但是 - 完全披露 - 我是沒(méi)有足夠的 Android 經(jīng)驗(yàn)來(lái)?yè)艽虼穗娫?huà)。請(qǐng)自行決定使用)。
添加回答
舉報(bào)