2012-12-16 31 views
0

我正在爲聯繫人創建新數據庫,並將conatctscontract字段的contact_id保留爲主鍵。我的問題是,如果有人刪除了聯繫人中的一行,那麼該聯繫人的contact_id將被android系統重新使用。如果是這樣,那麼我該如何防止在我的應用程序中使用該聯繫人ID,或者是否有更好的方法解決此問題?contactcontracts表中的字段CONTACT_ID是AUTO_INCREMENT

回答

0

如果您指的是內置的contactsprovider數據庫,則Contacts表和Data表的ID均爲AUTOINCREMENT。
所以我不認爲id會被重用。

您可以檢查代碼庫here

+0

是的。感謝那。您是如何設法找到該特定文件負責創建聯繫人數據庫的? –

+0

這是數據庫幫助文件用於在ContactsProvider內部創建數據庫 – nandeesh

1

我假設你使用MySQL。數據庫系統auto_increments contact_id主鍵。當該行被刪除時,該ID已經被「使用」並且作爲「used」被存儲在數據庫中,即使該行本身已被刪除。它將繼續保持下去,只要你不重置AUTO_INCREMENT起點(其語法看起來是這樣的)

ALTER TABLE contact AUTO_INCREMENT = 0; 

刪除的CONTACT_ID的,如果你使用的AUTO_INCREMENT功能,只要將不被重用因爲你不會重置該表的auto_increment設置(據我所知)。它只會從存儲在數據庫中的最高ID開始繼續。

編輯:如果我沒有弄錯,使用auto_increment的列用於存儲最新「auto_incremented」編號的特殊數據庫統計表(對您不可用,但自動從數據庫中存儲)。使用上面的語法將auto_increment重置回0,它將從那裏恢復,填補已被刪除的空白。

+0

所以,如果我有CONTACT_ID = 20,我刪除20將永遠不會被再次使用權CONTACT_ID? (我正在談論android中的contactcontracts表) –

+0

SQLite會跟蹤表使用特殊的SQLITE_SEQUENCE表保存的最大ROWID。只要創建了包含AUTOINCREMENT列的普通表,SQLITE_SEQUENCE表就會自動創建並初始化。可以使用普通的UPDATE,INSERT和DELETE語句修改SQLITE_SEQUENCE表的內容。但是對該表進行修改可能會干擾AUTOINCREMENT密鑰生成算法。在進行這樣的改變之前,確保你知道你在做什麼。 – kadeempardue

+0

來自SQLite網站。答案是肯定的,除非你從SQLLITE_SEQUENCE表中更新,否則不能再次使用它。這就是爲什麼他們稱之爲「自動」增量,這意味着數據庫會自動增加,除非你以某種方式改變它。如果你想改變算法,看看這篇文章的語法:http://stackoverflow.com/questions/692856/set-start-value-for-autoincrement-in-sqlite – kadeempardue

相關問題