Cocoa核心数据:设置默认实体属性值?

Cocoa核心数据:设置默认实体属性值?,cocoa,core-data,default-value,Cocoa,Core Data,Default Value,我知道我可以在数据模型或实体类的-awakeFromInsert方法中设置默认值。例如,要使日期属性默认为当前日期,请执行以下操作: - (void) awakeFromInsert { NSDate *now = [NSDate date]; self.date = now; } 如何使idNumber属性的默认值大于上一个对象的idNumber 谢谢,奥利 编辑:我尝试的相关代码现在已更正 如果调用maxIdNumber方法,新对象将添加到表中两次!?但是有正确的身份证号码。表中的两个条目

我知道我可以在数据模型或实体类的-awakeFromInsert方法中设置默认值。例如,要使日期属性默认为当前日期,请执行以下操作:

- (void) awakeFromInsert
{
NSDate *now = [NSDate date];
self.date = now;
}
如何使idNumber属性的默认值大于上一个对象的idNumber

谢谢,奥利

编辑:我尝试的相关代码现在已更正

如果调用maxIdNumber方法,新对象将添加到表中两次!?但是有正确的身份证号码。表中的两个条目是链接的-编辑/删除一个条目也会编辑/删除另一个条目。因此,我认为它与托管对象上下文有关。不管在awakFromNib中调用maxIdNumber方法多少次,两个副本的结果都是一样的;即使self.idNumber刚刚设置为[NSNumber numberwhithint:5],并且maxIdNumber方法只是为一次性变量调用

任何线索???

一种方法:创建实体所有实例的fetch请求,限制为1,按idNumber排序以获得最高的数字

另一种方法是:在存储的元数据中保留最高的idNumber并不断增加它

这两种观点都有很多赞成和反对的理由。归根结底,这是最常见的两种,选择权在你。

解决了它

好的,当从awakeFromInsert方法中执行提取请求时,会出现重复输入的问题。引述:

通常不鼓励您在awakeFromInsert实现中执行回迁。尽管允许,但执行fetch请求可能会触发发送内部核心数据通知,这可能会产生不必要的副作用。例如,在Mac OS X上,NSArrayController实例可能会在其内容数组中插入两次新对象

一种绕过它的方法是使用perfromSelector:withObject:afterDelay方法,正如这里所述,我只允许发布一个超链接::

现在,我的工作代码如下:注意,我已经将上面使用的大部分获取代码放入一个类别中,对其进行了一点整理,这允许我使用方法fetchObjectsForEntityName:withPredicate:withFetchLimit:withSortDescriptors:


让我知道你的想法

一种更简单的方法是重写NSArrayController的newObject方法:

- (id) newObject
{
    id result=[super newObject];
    [result setValue: [NSDate date] forKey: @"date"];
    return result;
}

顺便说一下,苹果不建议在实体中使用您自己的ID值。您可以使用NSManagedObject的objectID方法来获取NSManagedObjectID对象,它对于任何对象都是唯一的。不幸的是,当它持久化到存储区时,此id将从临时id更改为永久id。可以理解的是,大多数开发人员只是为了简单而使用自己的ID系统,它工作得很好。谢谢,idNumber字段不是用来区分对象的,它是用户必须提供的实体的属性。他们可以选择两个具有相同idNumber的对象,没有选择!!。它将与实体的其他属性一起显示在表中。感谢您的回复。好的,我已经创建了一个获取请求,它返回最高的idNumber,太好了!但是,每当我使用此代码设置idNumber属性时,该对象都会被添加到表中两次!?!?!尽管删除这两个实例中的任何一个,但使用“删除”按钮将同时删除这两个实例。有什么想法吗?好了,我把它放在原来的帖子里,让它更清晰。看起来你没有展示-maxidname是如何使用的。啊,对不起。好的,所有相关信息现在都应该在原来的帖子里。另外,fetch请求的代码相当冗长,我正计划将其移动到一个类别中,以便按照fetchObjectsForEntityName:withPredicate:withFetchLimit:withSortDescriptors:,提供一个更简洁的方法。坏主意,好主意?为什么在返回int时返回类型是NSNumber?一开始我没听清楚。如果这是答案,点击复选标记,系统会显示为已回答。我不能,我必须等到明天才能接受我自己的答案:!!
- (void) awakeFromInsert
{
[self performSelector:@selector(setIdNumber) withObject:nil afterDelay:0];
self.date = [NSDate date];
}


-(void)setIdNumber
{
int num  = 0;

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"idNumber" ascending:NO];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"idNumber > %@", [NSNumber numberWithInt:0]];

NSArray *array = [[self managedObjectContext] fetchObjectsForEntityName:@"Flight" 
                                                          withPredicate:predicate 
                                                         withFetchLimit:0
                                                    withSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];   

if (array != nil & array.count != 0)
{
    num = [[[array objectAtIndex:0] valueForKey:@"idNumber"] intValue]; 
} 

num ++;

[self setIdNumber:[NSNumber numberWithInt:num]];
}
- (id) newObject
{
    id result=[super newObject];
    [result setValue: [NSDate date] forKey: @"date"];
    return result;
}