[英]How to fetch data using predicate with the ALL … IN format string
所以我有一個核心數據實體“事務”,其屬性“標簽”與另一個實體“標簽”相關。 兩個實體之間的關系類型是多對多的。 這意味着一個交易可以有很多標簽,一個標簽可以有很多交易。
現在,我創建了一個基於特定標簽獲取交易條目的方法。 該方法如下所示:
func transactions(withTags tags: [Tag] = [], matchCriteria: String = "ANY") {...}
所以在 function 中,我使用了如下謂詞:
predicate = NSPredicate(format: "(%@ <= date) AND (date < %@) AND (\(matchCriteria) tags IN %@)", argumentArray: [startDate, endDate, tags])
所以謂詞中的關鍵元素是“ANY tags IN %@”,它基本上只是搜索給定的標簽,如果在條目中找到任何這些標簽,那么就會有匹配。 這個謂詞非常適合這個目的。
但是現在,我想做的是有一個類似的謂詞,但是,我希望它僅在找到所有給定標簽時才返回匹配項。 例如,如果我有 2 個標簽,例如“計划”和“付費”。 然后只返回帶有兩個標簽的條目。
因此,根據此處的 Apple 文檔https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795 ,似乎有一個“全部”運算符。 所以我嘗試創建一個類似於下面的謂詞:
predicate = NSPredicate(format: "(%@ <= date) AND (date < %@) AND (ALL tags IN %@)", argumentArray: [startDate, endDate, tags])
只需將 ANY 替換為 ALL。 但它似乎不起作用,它使我的應用程序崩潰。 我得到的錯誤是“線程 1:異常:“不支持的謂詞......”。這是我卡住的地方,希望你們能指出我正確的方向。
為了滿足上述要求,正確的謂詞應該是什么?
提前致謝!
首先請注意,即使它沒有崩潰,您的謂詞(“%@ 中的所有標簽”,標簽)也不會完全符合您的要求。 只有當它的所有標簽都在列表中時,它才會確保交易包含在結果中。 但是,如果它只有一個標簽,並且只匹配您列表中的一個,它仍然會被包括在內。 您需要的是相反的(“ALL %@ IN tags”)。 但這會導致同樣的崩潰。
實現您想要的最簡單的方法是准備一個復合謂詞,依次從列表中獲取每個標簽,例如:
"(ANY tags == 'planned') AND (ANY tags == 'paid')"
您可以為您的tags
數組相當快速地構建它:
let datePredicateArray = [NSPredicate(format: "(%@ <= date) AND (date < %@)", argumentArray: [startDate, endDate])]
let tagPredicateArray = tags.map {NSPredicate(format:"ANY tags == %@", $0)}
let allPredicates = datePredicateArray + tagPredicateArray
let finalPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: allPredicates)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.