2011-07-12 67 views
3

我剛開始深入瞭解一些基本的Android開發,並試驗了ListView並將其與SimpleCursorAdapter集成。我瀏覽了很多在線代碼示例,但我也有一本書可用作參考(專業Android 2應用程序開發)。ListView行ID和位置索引混淆

在本書中,他們制定了一個示例待辦事項列表應用程序,該應用程序將列表項存儲在帶有自動遞增整數主鍵字段的SQLite數據庫中。

用戶可以創建新的列表項目,但也可以從列表中刪除選定的項目。在代碼中,當刪除發生時,主鍵字段被限制(在SQL語句的WHERE子句內)該項目的position屬性,而不是該項目的rowid

對我來說,這似乎是一個不正確的實現。看看AUTOINCREMENT的SQLite文檔,它說這個值總是會增加,舊值永遠不會在同一張表上重複使用。因此,如果您要刪除列表並將其添加到列表中,則位置和行ID似乎可能會很快失去同步。

那麼,我是否正確,然後,假設行ID是「索引」到數據庫表和不是列表位置的正確方法?如果使用常規的ListAdapter,我認爲該位置可以安全使用,但在索引數據庫時看起來並不合適。

+0

他們不只是使用列表位置來檢索行ID,然後刪除行ID? –

+0

沒有。他們將該位置傳遞給一個只運行以下內容的函數:'return db.delete(DATABASE_TABLE,KEY_ID +「=」+ _rowIndex,null)> 0;'_rowIndex'是該項目的位置,而不是行ID 。這是從上下文菜單回調中調用的,它們將'menuInfo.position'作爲'_rowIndex'來傳遞。 –

+0

好的,現在接聽 –

回答

0

這絕對是不好的做法。我總是使用行ID來刪除,並使用位置ID來檢索遊標的行ID。我在家裏有這本書的第一版,稍後我會自己看看。

1

您可以使用位置獲得光標到特定列表條目(這光標將是「行」中的「表」對應的行ID):

Cursor cursor = (Cursor)parent.getItemAtPosition(pos); 
int rowCol = c.getColumnIndex("_id"); 

那麼你應該看到cursor.getLong(rowCol) == id

+0

好的,這看起來很合理。所以在內部,列表知道位置如何映射到行,所以'getItemAtPosition()'應該返回正確的項目。謝謝! (仍然不是這本書的做法,也不是我發現的第一個錯誤)。 –