1

我在编写正确的 NSPredicate 时遇到了一个非同寻常的问题。我有以下模型结构(仅显示了一个相关模型) 在此处输入图像描述

如您所见,有四个 AttributeValue 实体继承自父实体。现在我需要使用谓词执行请求。

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:@"Entity" inManagedObjectContext:managedObjectContext];
[request setIncludesPropertyValues:NO];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY attributeValues.value = %@",@"Certain value"];

[request setPredicate:predicate];
NSArray *results = [managedObjectContext executeFetchRequest:request error:&error];

当然这个请求会导致异常:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath attributeValues.value not found in entity <NSSQLEntity Entity id=11>'
*** 

因为基础实体确实没有value属性。有没有办法绕过这种情况?我需要从实体端以这种方式填充数据。

4

1 回答 1

0

您正在引用类型的实体AttributeValue。这个实体有一个value字段,但从模式中不清楚它是什么类型或它引用什么。我认为您不能在子实体中有意义地重复相同的属性名称。

如果要引用字符串,则必须通过关系AttributeValueString将实体连接到您的Entity实体。您不能将父实体用作“包罗万象”。子实体从其父实体继承属性,但不用于代替关系。(您可能会因为模型模式视图中的漂亮箭头而感到困惑;-)。

因此,在您的情况下,您将需要来自Entity实体的四种不同关系来表示所有值类型。

让我建议一个不同的设置。恕我直言,将适当的属性添加到AttributeValue类本身并取消子实体更为可行。您始终可以将未使用的留空。如果需要,您甚至可以添加type指示类型的属性(某种枚举)。

AttributeValue
|_____ stringValue
|_____ integerValue
|_____ doubleValue
|_____ binaryValue
|_____ type

这似乎是一个更加健壮和易于管理的设置。

在您的谓词中,您必须明确说明您要查询的数据类型。从良好的编程实践的角度来看,这似乎也是有道理的。

于 2013-03-29T12:54:58.757 回答