我已經開始使用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;
}
Aircraft
是NSManagedObject
一個子類。這個謂詞效果很好,我只是循環了一些對象,並將每個對象加入到謂詞中,所以如果飛機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
。但它揭示了下一個問題(可能一直是問題)。
請發表'predicateFinal'的NSLog輸出。 – memmons
注意:如果您已經有一個託管對象數組,您可以直接使用'IN'創建一個謂詞:'NSArray * uniqueAircraftIDs = [aircraftArray valueForKeypath:@「distinctUnionOfObjects.objectID]; NSPredicate * newPredicate = [NSPredicate predicateWithFormat:@」 (objectID IN%@)「,uniqueAircraftIDs];' – memmons
感謝您的提示(可惜不是解決方法)'predicateFinal'只輸出'TRUEPREDICATE' –