我在撰写适当的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
属性。有办法绕过这种情况吗?我需要从实体端以这种方式填充数据。
答案 0 :(得分:0)
您正在引用类型为AttributeValue
的实体。此实体具有value
字段,但从模式中不清楚它是什么类型或它引用的内容。我认为你不能在子实体中重复相同的属性名称。
如果您想引用字符串,则必须通过关系将AttributeValueString
实体连接到Entity
实体。您不能将父实体用作“全能”。子实体从其父实体继承属性,但不使用它们而不是关系。 (由于模型的模式视图中的漂亮箭头,您可能会感到困惑;-)。
因此,在您的情况下,您需要与Entity
实体建立四种不同的关系才能表示所有值类型。
让我建议一个不同的设置。恕我直言,将适当的属性添加到AttributeValue
类本身并取消子实体更为可行。您可以随时将未使用的空白留空。如果需要,您甚至可以添加一个type
属性(某种枚举)来指示类型。
AttributeValue
|_____ stringValue
|_____ integerValue
|_____ doubleValue
|_____ binaryValue
|_____ type
这似乎是一个更强大和易于管理的设置。
在谓词中,您必须明确说明要查询的数据类型。从良好的编程实践的角度来看,这似乎也是有意义的。