簡體   English   中英

CoreData 使用集合交集獲取謂詞

[英]CoreData fetch predicate using a set intersection

我的核心數據 model 有一個實體,其屬性setOfStrings的類型為Transformable
對應的 class 有一個屬性@NSManaged var setOfStrings: Set<String>? .
我想使用一個謂詞來獲取對象,該謂詞過濾掉其屬性setOfStrings與給定集合具有集合交集的對象,例如givenSet
我嘗試使用以下謂詞:

NSPredicate(format: "ANY setOfStrings IN %@", givenSet)

但它總是評估為false
如果我注釋掉這個謂詞,則未過濾的對象會被正確提取。
我閱讀了許多與該主題相關的 SO Q/A,例如這個 但是它不起作用。
我知道,如果我的屬性setOfStrings是一個關系,我可以使用子查詢來獲取正確的對象,如此處所示 但我沒有關系,只是一組字符串。
我也讀過這篇文章

我假設該集合被定義為一個可轉換的屬性,這意味着它作為二進制存檔存儲在 SQLite 文件中。 那么上述查詢最多對已加載到托管 object 上下文的對象有效,但不適用於存儲文件。

這顯然與我的問題有關。 但是在我看來,用一對多關系替換一組簡單字符串的建議解決方案似乎太復雜了。
我應該使用哪個謂詞?

恐怕基於可轉換屬性的謂詞無法作為提取的一部分。 您要么必須獲取所有內容,然后在 memory 中過濾結果,要么使用不同類型的屬性:一對多關系是最好的,但您可能能夠將字符串連接成單個字符串並將其存儲. 那么你的謂詞可能會與之相反。

但這取決於字符串的細節。 例如,如果它們是單個單詞,例如 colours:“red”、“green”、“blue”、“cyan”等,那么您可以將它們與空格連接起來並存儲一個字符串:

"red green blue cyan"

(當然,您必須添加代碼以在需要單獨顏色的地方再次將它們分開)。

假設您想使用謂詞來查找具有“綠色”或“藍色”的對象。 然后,您將按照以下方式構造謂詞:

colourString CONTAINS "blue" OR colourString CONTAINS "green"

如果您的字符串或搜索條件更復雜,則可能需要使用不同的連接方式。 例如,如果您有多個單詞的顏色,如“淡綠色”、“淡黃色”,則搜索“綠色”可能會匹配“深綠色”、“淡綠色”等(可能是好也可能是壞)。 如果這很糟糕,您可能需要使用不同的分隔符(例如逗號),那么您的字符串可能是:

"red,blue,pale green,cyan"

並且您找到“綠色”而不是“淡綠色”的謂詞將是:

colourString CONTAINS ",green,"

雖然有一些令人討厭的邊緣情況,其中“綠色”是第一個或最后一個顏色,所以你需要在你的 colourString 中包含一個前導和尾隨逗號:

",red,blue,pale green,cyan,"

這開始變得越來越混亂。 如果您的字符串可能已經包含逗號,則需要使用不同的分隔符和更復雜的謂詞。 根據您的數據,多對多關系可能更容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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