2017-04-12 135 views
0

我有一個模型與關係屬性文章的類別是一個NSOrderedSet。 現在我想要得到與在一定條件滿足的文章的所有類別,在SQL我會寫:一對多過濾器導航屬性

SELECT * 
FROM Category AS cat 
JOIN Article AS art ON art.categoryId = cat.categoryId AND art.gender='m'; 

我試着用:

NSPredicate(format: "articles.gender like %@ OR articles.gender = %@", gender.lowercased(), "n") 

我收到以下錯誤:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here'

完整代碼:

let ctx = self.Context() 

    var gender = UserDefaults.standard.string(forKey: "gender_preference") ?? "*" 
    if gender.uppercased() == "N" { gender = "*" } 

    // Create Fetch Request 
    let fetchRequest: NSFetchRequest = ArticleCategory.fetchRequest() 
    let predicate = NSPredicate(format: "articles.gender like %@ or articles.gender = %@", gender, "n") 
    fetchRequest.predicate = predicate 

    // sort by name 
    let sort = NSSortDescriptor(key: "name", ascending: true) 
    fetchRequest.sortDescriptors = [sort] 

    do { 

     let result = try ctx.fetch(fetchRequest) 
     return result 

    } catch { 

     print(error) 

    } 

    return [] 

親切的問候

編輯:

Model Relationship

+0

你試過用'ANY'? 'NSPredicate(format:「ANY articles.gender like%@ OR articles.gender =%@」,gender.lowercased(),「n」)' – mat

+0

對不起,是的,我試過了,對於一些和所有的都一樣 – Mario

回答

0

我覺得它更可靠的使用SUBQUERY而不是ANY,ALL,NONE還是有的,尤其是複合條款。抓取,此時它的任何物品都滿足的條件是等同於獲取如果滿足條件文章計數大於零分類:

let predicate = NSPredicate(format: "SUBQUERY(articles, $a, $a.gender like %@ OR $a.gender == %@)[email protected] > 0", gender, "n") 
+0

查詢編譯,但它不是我所需要的。我想按性別過濾文章。沒有得到超過0條的類別... – Mario

+0

@Mario在這種情況下,獲取articles not ArticleCategories,並使用更簡單的謂詞:'let fetchRequest:NSFetchRequest = Article.fetchRequest() let predicate = NSPredicate(format: 「性別如%@或性別=%@」,性別,「n」)' – pbasdf