swift - 过滤一对多的导航属性

标签 swift core-data swift3 ios10 ios10.3

我有一个模型类别,其关系属性文章是一个 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

最佳答案

我发现使用 SUBQUERY 比使用 ANY、ALL、NONE 或 SOME 更可靠,尤其是对于复合子句。获取任何文章满足条件的类别相当于获取满足条件的文章数大于零:

let predicate = NSPredicate(format: "SUBQUERY(articles, $a, $a.gender like %@ OR $a.gender == %@).@count > 0", gender, "n")

关于swift - 过滤一对多的导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43378486/

相关文章:

ios - 选项卡栏上的选定索引不适用于 Swift

ios - 将对象转换为 id

ios - 从 App Store 上的应用程序中删除核心数据支持

ios - 使用图像上传 Swift 动态调整 UICollectionViewCell 的大小

ios - Swift:如何使选项卡 View Controller 按钮不显示?

swift - 在 UITextView 中放置附加文本 - WhatsApp 时间戳副本

ios - 快速动态创建对象和设置属性

objective-c - 在 UITableViewCell 中带有 CheckBox 的 CoreData

sprite-kit - GKEntity/组件更新周期最佳实践

Swift:将字符串转换为 NSTextField