好吧,假設我已經正確地理解了問題,我會這樣做。假設你有兩個實體,TopEntity有一個(NSString *)名稱屬性和一個多對多的MyEntity關係,它有一個(NSString *)數據屬性和(NSInteger)次序屬性。
比方說你想匹配一個給定的字符串,而其myEntity所訂單滿足一定條件,那麼你可以用兩個謂詞做和NSFetchRequest像這樣將TopEntity對象....
NSManagedObjectContext *context = [self managedObjectContext];
// Create some top level entities
TopEntity *aTop = [TopEntity insertInManagedObjectContext:context];
aTop.name = @"This is Your Name";
TopEntity *bTop = [TopEntity insertInManagedObjectContext:context];
bTop.name = @"This aint a Name";
TopEntity *cTop = [TopEntity insertInManagedObjectContext:context];
cTop.name = @"This is My Name";
// Add some data
NSInteger i, len = 30;
for(i=0; i<len; i++) {
// Create a new object
MyEntity *entity = [MyEntity insertInManagedObjectContext:context];
entity.orderValue = i;
entity.data = [NSString stringWithFormat:@"This is some data: %d", i];
if(i < 10) {
[aTop addObjectsObject:entity];
[entity addTopObject:aTop];
} else if (i < 20) {
[bTop addObjectsObject:entity];
[entity addTopObject:bTop];
} else {
[cTop addObjectsObject:entity];
[entity addTopObject:cTop];
}
}
// Save the context
NSError *error = nil;
[context save:&error];
// A predicate to match against the top objects
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH %@", @"This is"];
// A predicate to match against the to-many objects
NSPredicate *secondPredicate = [NSPredicate predicateWithFormat:@"ANY objects.order < %d", 5];
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setEntity:[NSEntityDescription entityForName:@"TopEntity" inManagedObjectContext:context]];
[fetch setPredicate:predicate];
NSArray *result = [[context executeFetchRequest:fetch error:&error] filteredArrayUsingPredicate:secondPredicate];
for(TopEntity *entity in result) {
NSLog(@"entity name: %@", entity.name);
}
所以,基本上你可以用另一個謂詞來包裝你的獲取請求的結果並使用ANY關鍵字。
我不知道這是多高效,但它適用於這種情況。運行上述操作將輸出「This is Your Name」,即它與第一個TopEntity匹配。
我一直希望能夠通過單一的謂詞獲取來完成它,但我開始認爲它無法完成。我感覺使用額外的屬性 - 反規範化 - 可能是最好的方式,性能也是。 – 2010-11-26 21:34:46
當然,每個對象搜索一次獲取請求的方法對於大量搜索對象來說是非常浪費和不合理的,但對於小列表來說,它可能是一個合理的命中。我個人使用「lastN」標誌方法。我認爲(但不要引用我)關係自動意味着與核心數據的多次往返。 – 2010-11-26 21:44:47