2011-01-11 202 views
3

我已經設法刪除使用核心數據存儲的所有實體(下面的this answer)。如何重置核心數據中的主鍵數/最大值?

問題是,我注意到主鍵仍然在向上計數。有沒有一種方法(無需手動編寫SQL查詢)重置實體的Z_MAX值?下面的截圖澄清我的意思。

價值本身不是問題,但我只關心在未來的某個時間點可能達到的最大整數,我不希望發生這種情況。我的應用程序會將數據與Web服務同步並使用核心數據對其進行緩存,因此,主鍵一次可能會增加數百/數千個。刪除整個Sqlite DB不是一個選項,因爲我需要保留其他實體的一些信息。

我見過'重置'方法,但肯定會重置整個Sqlite數據庫?我如何才能重置這一組實體的主鍵?與其他實體沒有關係,我想要重置主鍵。

Screenshot

回答

8

我只是擔心,在未來的某一時刻 的最大整數可能 達到,我不希望這種情況發生 。

真的嗎?什麼類型是你的主要關鍵?因爲如果它不是Int16以外的任何東西,你真的不需要關心它。一個有符號的32位整數給你2,147,483,647個值。 64位有符號整數爲您提供了9,223,372,036,854,775,807個值。

如果你認爲你會使用所有這些,你可能有更重要的事情要擔心比整數溢出。

更重要的是,如果你使用核心數據,你不需要關心或真正使用主鍵。核心數據不是數據庫 - 在使用核心數據時,您打算使用關係,而不是真正關心主鍵。核心數據對他們沒有真正的需求。

2

從源碼FAQ:

如果最大可能的整數鍵, 9223372036854775807,然後一個未使用的 密鑰值是隨機選擇。

9,223,372,036,854,775,807 /(1024^4)= 8,388,608 tera-rows。我懷疑你會首先遇到其他限制。 :) http://www.sqlite.org/limits.html審查更實際的限制,你會遇到。

問一個方便的核心數據存儲產量的sqlite3:

sqlite> .schema zbookmark 
CREATE TABLE ZBOOKMARK (Z_PK INTEGER PRIMARY KEY, ... 

注缺乏「自動增量」,這在sqlite的意思是永遠不會重複使用的關鍵。因此,核心數據確實允許重複使用舊密鑰,所以即使您設法隨着時間的推移添加(並刪除大部分)許多行,您也是非常安全的。

如果你真的想重置它,在蘋果的z_表中尋找真正的唯一方法。 [這是而不是說這是你應該事實上做的事情。它不是(至少在任何你想要發佈的代碼中),即使它看起來可行。]

+3

你***不***意味着編輯核心數據的SQLite(或)直接存儲。實施細節不公開,隨時可能更改。這是一個壞主意。 – 2011-01-11 23:53:51

1

除此之外直接/手動編輯核心數據存儲是一個窘況愚蠢的想法事實上,正確的答案是:

刪除數據庫並重新創建它。

當然,你會失去所有的數據,但如果你關心這個小數字,那麼沒關係,對吧?

哦,核心數據將確保您沒有主鍵衝突。

8

核心數據使用64位整數主鍵。除非I/O系統的速度提高了許多個數量級,這與CPU不同,它們近年來還沒有,可以在數百萬年內儘可能快地保存。

請用完後請提交bugreport.apple.com的錯誤。