簡體   English   中英

如何使用帶有 ALL ... IN 格式字符串的謂詞獲取數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM