CoreData NSFetchResult问题

时间:2013-03-29 09:00:34

标签: ios core-data nspredicate nsfetchrequest

我在撰写适当的NSPredicate时遇到了一个非同寻常的问题。 我有以下模型结构(只显示了一个相关的模型) enter image description here

如您所见,有四个从父实体继承的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属性。有办法绕过这种情况吗?我需要从实体端以这种方式填充数据。

1 个答案:

答案 0 :(得分:0)

您正在引用类型为AttributeValue的实体。此实体具有value字段,但从模式中不清楚它是什么类型或它引用的内容。我认为你不能在子实体中重复相同的属性名称。

如果您想引用字符串,则必须通过关系将AttributeValueString实体连接到Entity实体。您不能将父实体用作“全能”。子实体从其父实体继承属性,但不使用它们而不是关系。 (由于模型的模式视图中的漂亮箭头,您可能会感到困惑;-)。

因此,在您的情况下,您需要与Entity实体建立四种不同的关系才能表示所有值类型。

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

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

这似乎是一个更强大和易于管理的设置。

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