0

我已經開始使用NSCompoundPredicate來組合我的謂詞,但是有一個問題。NSCompoundPredicate混合AND和或

這裏是一個謂詞的示例:

Aircraft *obj = (Aircraft *)[self.managedObjectContext objectWithID:objID]; 
if ([predicateAircraft.predicateFormat isEqualToString:@""] || !predicateAircraft) 
    predicateAircraft = [NSPredicate predicateWithFormat:@"aircraft = %@", obj]; 
else 
{ 
    NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"aircraft = %@", obj]; 
    NSPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:predicateAircraft, newPredicate, nil]]; 
    predicateAircraft = compoundPredicate; 
} 

AircraftNSManagedObject一個子類。這個謂詞效果很好,我只是循環了一些對象,並將每個對象加入到謂詞中,所以如果飛機1或飛機2等等等等...

我這樣做的幾個屬性,代碼與上面相同,但是爲不同的關係創建謂詞等。基本上,用戶可以過濾他們看到的數據,比如哪個飛機。

無論如何,一旦我建立了一個謂語對於這些,我將它們結合起來,像這樣:

NSPredicate *predicateFinal = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:predicateAircraft, predicateBatteries, predicatePilot, nil]]; 

這一次,使用AND將它們結合起來。但是,使用此謂詞不會過濾我的數據。他們單獨工作,但沒有在最後一行合併在一起。任何想法爲什麼?這就是我需要解決的問題。

我有一種預感,那也許是因爲它是創造這樣的:aircraft1 OR aircraft2 OR ... AND ... pilot1 OR pilot2 OR...

通常你將需要約每一位括號,如各地的飛機和飛行員將它們分開,但該化合物不會做這個?

有效什麼,我得到的是:

aircraft = aircraftObj1 OR aircraft = aircraftObj2 AND pilot = pilotObj1 OR pilot = pilotObj2 

我需要什麼(我想):

(aircraft = aircraftObj1 OR aircraft = aircraftObj2) AND (pilot = pilotObj1 OR pilot = pilotObj2) 

無論如何,任何想法?謝謝。

編輯:

predicateFinal日誌爲:TRUEPREDICATE。沒有太多,但顯然TRUEPREDICATE:謂詞總是評估爲TRUE,並且是一個謂詞布爾值。上帝知道爲什麼它返回?!據推測,返回正確的原因是爲什麼沒有視覺變化是取得結果?當返回時沒有變化,所有對象都被取出。

編輯2:

現在真正的進步。我已經修復了battery對象作爲NSSet對多關係的一部分的任何問題,但要做ANY battery。但它揭示了下一個問題(可能一直是問題)。

+0

請發表'predicateFinal'的NSLog輸出。 – memmons

+0

注意:如果您已經有一個託管對象數組,您可以直接使用'IN'創建一個謂詞:'NSArray * uniqueAircraftIDs = [aircraftArray valueForKeypath:@「distinctUnionOfObjects.objectID]; NSPredicate * newPredicate = [NSPredicate predicateWithFormat:@」 (objectID IN%@)「,uniqueAircraftIDs];' – memmons

+0

感謝您的提示(可惜不是解決方法)'predicateFinal'只輸出'TRUEPREDICATE' –

回答

1

好的,在一個複合詞中混合「AND」和「OR」Predicate我做了這個...

if ([searchCriteria isEqualToString:@"All"]) { 
    [parr addObject:[NSPredicate predicateWithFormat:@"aID_Name  like[cd] %@",mySearchBar.text]]; 
    [parr addObject:[NSPredicate predicateWithFormat:@"aTrackingNum like[cd]   [parr addObject:[NSPredicate predicateWithFormat:@"aRegNum  like[cd] %@",mySearchBar.text]]; 
    predicate = [NSCompoundPredicate orPredicateWithSubpredicates:parr]; 
} 

[parr removeAllObjects]; 
[parr addObject:predicate]; 
if (aGroups) 
    [parr addObject:[NSPredicate predicateWithFormat:@"SUBQUERY(self.group, $x, $x.gID_Key IN %@)[email protected] > 0",[aGroups valueForKey:@"gID_Key"]]]; 

predicate = [NSCompoundPredicate andPredicateWithSubpredicates:parr]; 
NSLog(@"%@",predicate); 
2

原來,NSCompoundPredicate返回TRUEPREDICATE,因爲我的化合物中的第一個子謂詞是零。 (Simple eh?Doh!)因此,如果第一個子謂詞是零,如果其他人不是零,則無關緊要,它將在那裏停止並返回TRUEPREDICATE而不過濾您的抓取。

+0

我剛碰到這個確切的問題。謝謝! –