在我的应用程序中,我想比较实体“Workout”的2个核心数据实例。我想检查2个对象的所有属性是否具有相同的属性值。基本上如果两个对象相同,减去关系,那就是workout。有没有办法在不手动检查每个属性的情况下执行此操作?我知道我能做到:
if(object1.intAttr == object2.intAttr){
NSLog(@"This attribute is the same");
}
else{
return;
}
repeat with different attributes...
是否有任何核心数据方法可以减少繁琐?
答案 0 :(得分:3)
首先,我会在isEqual
子类中创建一个Workout
方法,就像这样......
-(BOOL)isEqualToWorkout:(Workout*)otherWorkout
{
return [self.attribute1 isEqual:otherWorkout.attribute1]
&& [self.attribute2 isEqual:otherWorkout.attribute2]
&& [self.attribute3 isEqual:otherWorkout.attribute3]
&& [self.attribute4 isEqual:otherWorkout.attribute4]
...;
}
然后,只要您想与Workout
对象进行比较,只需使用...
BOOL equal = [workout1 isEqualToWorkout:workout2];
答案 1 :(得分:2)
您可以按名称迭代属性。
for (NSString *attribute in object.entity.attributesByName) {
if ([[object valueForKey:attribute] intValue] !=
[[object2 valueForKey:attribute] intValue]) {
return NO;
}
}
return YES;
这假设所有整数属性。您可以使用switch语句检查具有class
方法的类,并处理不同的数据类型。
答案 2 :(得分:0)
如果需要比较一个对象是代表比另一个对象更大还是更小的值,则不能使用标准C比较运算符>和<。相反,基本的Foundation类型,如NSNumber,NSString和NSDate,提供了compare:方法:
if ([someDate compare:anotherDate] == NSOrderedAscending) {
// someDate is earlier than anotherDate
}
答案 3 :(得分:-1)
我最终做了以下事情:
-(BOOL)areEqual:(Workout *)firstWorkout secondWorkout:(Workout *)secondWorkout{
NSArray *allAttributeKeys = [[[firstWorkout entity] attributesByName] allKeys];
if([[firstWorkout entity] isEqual:[secondWorkout entity]]
&& [[firstWorkout committedValuesForKeys:allAttributeKeys] isEqual:[secondWorkout committedValuesForKeys:allAttributeKeys]]) {
return YES;
}
else{
return NO;
}
}