2011-01-11 200 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的错误。