核心数据:生成唯一ID号

时间:2009-11-10 11:01:42

标签: cocoa core-data uniqueidentifier

我有一个看起来像这样的窗口: UI

每次添加记录时,我都希望将修复ID设置为尚未在表中使用的唯一编号。例如如果有ID号1,2,3,那么当我按+时,ID字段应设置为'4'。 此外,如果删除表中的一个记录,以便ID号为:1,2,4,那么当我按+时,记录ID中的数字应设置为3.

目前,我有一个自定义的ManagedObject类,我在其中声明:

-(void)awakeFromInsert {
    [self setValue:[NSDate date] forKey:@"date"];
}

为了将日期设置为今天的日期。

我将如何实施此唯一记录ID?

谢谢!

4 个答案:

答案 0 :(得分:2)

对于纯粹的自动增量ID(如this question中所要求的那样),类似于this message中描述的内容可能会起作用。不幸的是,这不会提供填充列表中已删除项目空白的值。

答案 1 :(得分:1)

我使用了之前日期的数字形式(快速检查以确保它实际上是唯一的 - 即时钟尚未调整)。 + [NSDate timeIntervalSinceReferenceDate]返回NSTimeInterval(这是一个typedef double)。我认为这与时区,“夏令时”等无关。

正如我之前提到的,唯一的弱点是时钟正在调整,但你总能确保它是独一无二的。如果您的要求多于您列出的要求,请与我们联系。我自己也有一些,我相信这是足够的解决办法。

答案 2 :(得分:1)

对于少量记录,只需循环浏览它们,直到找到一个免费ID。这里是伪代码,因为我不懂你的语言:

int RepairID=1;
While isUsed(RepairID) {
    RepairID=RepairID+1;
}
return RepairID;

对于大量记录,您可以跟踪已删除ID的列表:s和最高ID。添加记录时选择最小的已删除ID,或者如果没有删除的ID可以重复使用,请使用最高ID + 1

答案 3 :(得分:1)

如果在界面中使用Array Controller,则可以在arrangeObjects数组上使用count方法来创建ID。您可以通过覆盖 - (id)newObject方法

来实现
//implemented in yourArrayController.m

-(id)newObject
{
//call the super method to return an object of the entity for the array controller
NSManagedObject* yourNewObject = [super newObject]; 

//set the ID the count of the arrangedObjects array
NSNumber* theID = [NSNumber numberWithInteger:[[self arrangedObjects] count]];

[yourNewObject setValue:theID forKey:@"ID"];

//return your new Object 
return yourNewObject;
}