0

我有一个看起来像这样的窗口: 用户界面

每次添加记录时,我都希望将修复 ID 设置为表中尚未使用的唯一编号。例如,如果有 ID 号 1、2、3,那么当我按 + 时,ID 字段应设置为“4”。另外,如果表中的一条记录被删除,使得ID号为:1,2,4,那么当我按+时,Record ID中的数字应该设置为3。

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

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

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

我将如何实施这个唯一的记录 ID?

谢谢!

4

4 回答 4

2

对于纯粹的自动递增 ID(就像在这个问题中要求的那样),类似于此消息中描述的内容可能会完成这项工作。不幸的是,这不会提供填充列表中已删除项目空白的值。

于 2009-11-10T13:35:27.300 回答
1

对于少量记录,只需遍历它们,直到找到一个空闲 ID。伪代码在这里,因为我不知道你的语言:

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

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

于 2009-11-10T19:07:15.920 回答
1

我之前使用过日期的数字形式(通过快速检查以确保它实际上是唯一的——即时钟尚未调整)。+[NSDate timeIntervalSinceReferenceDate] 返回一个 NSTimeInterval (这是一个 typedef 双精度)。我相信这与时区、“夏令时”等无关。

正如我之前提到的,唯一的弱点是时钟正在调整,但你总是可以确保它是独一无二的。如果您有比您列出的更多的要求,请告诉我。我自己也有一些,我认为有足够的解决方法。

于 2009-11-10T18:53:44.410 回答
1

如果您在界面中使用数组控制器,您可以在其排列对象数组上使用 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;
}
于 2011-06-10T03:55:53.587 回答