核心数据:对多对多关系的谓词

时间:2010-02-09 20:42:44

标签: iphone objective-c core-data

我有一个包含4个实体的CoreData模型。

模特截图 - > http://img96.imageshack.us/img96/7857/screenshot20100209at182.png

国家

  

-StateName

位置:

  

-locationName(attribute)

     

-locationDescription

     

-locationActivities(relatinship)

     

-state(relationship)

LocationActivities:

  

-location(relationship)

     

- 活动(关系)

活动

  

-activityName(属性)

     

-locationsActivities(relationship)

如何编写选择具有

的所有位置的查询
  

(活动='高尔夫'或活动=   '游泳')和州='洛杉矶'

3 个答案:

答案 0 :(得分:5)

// With some NSManagedObjectContext *moc
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:@"Location"
                               inManagedObjectContext:moc]];
[request setPredicate:[NSPredicate predicateWithFormat:
                       @"(locationActivities.activity.activityName == %@ OR 
                          locationActivities.activity.activityName == %@) AND 
                         state.stateName == %@",
                       @"Golf", @"Swimming", @"LA"]];
NSError *error;
NSArray *results = [moc executeFetchRequest:request error:&error];

基本上,正常进行核心数据提取,然后构建适当的谓词来过滤结果(如Predicate Programming Guide中所述)。

答案 1 :(得分:1)

我刚注意到,在您的屏幕截图中,您的LocationActivities实体实际拼写为LocationAtivities(请注意缺少的“c”)。

这足以破坏你的图表。任何查找LocationActivities的谓词都将失败。

这样的错误让我讨厌编程。我似乎花了更多的时间来追踪拼写错误而不是修复设计错误。

答案 2 :(得分:-1)

另外,您需要停止考虑核心数据的表和查询。在Core Data中,只有sqllite持久存储的细节,你永远不会看到它们或处理它们。

实体不是表,关系不是表链接。试图将对象模型塞进脑中的SQL会让你感到悲伤,因为Core Data不像SQL那样工作。