NSPredicate核心数据中的多对多关系

Hug*_*otl 6 core-data nspredicate ios swift

我有一个NSPredicate包含多个聚合过滤器,这是一个异常.

我有以下核心数据模型:

核心数据模型

我想选择那些有13576743的ApparelItems任何colours一个rgb,并且所有的pickspickTime早于给定的那些NSDate.

我创建谓词的代码是:

let request = NSFetchRequest(entityName: "ApparelItem")
var predicates = [NSPredicate]()

predicates.append(NSPredicate(format: "ANY colours.rgb = 13576743"))

// find the NSDate representing midnight x days ago
let cal = NSCalendar.currentCalendar()
if let xDaysAgo = cal.dateByAddingUnit(.Day, value: -2, toDate: NSDate(), options: [])
{
    let midnightXDaysAgo = cal.startOfDayForDate(xDaysAgo)

    predicates.append(NSPredicate(format: "(ALL picks.pickTime < %@)", midnightXDaysAgo))
}

request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicates)

let searchData = try? objectContext.executeFetchRequest(request)
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

Exception name=NSInvalidArgumentException, reason=Unsupported predicate (ANY colours.rgb == 13576743) AND ALL picks.pickTime < CAST(479347200.000000, "NSDate")
Run Code Online (Sandbox Code Playgroud)

我试过了:

  1. 每个单独的谓词都可以.即ANY colours.rgb = ...工作,也ALL picks.pickTime < ...有效.它们在组合到同一查询时只是不起作用.

  2. 将两者结合使用到单个查询中,与之链接AND,而不是使用NSCompoundPredicate.结果是一样的.

核心数据是否可能不支持对多对多关系进行过滤?这看起来很奇怪.在哪种情况下我应该怎么做?

All*_*len 2

也许可以尝试SUBQUERY()一下NSPredicate

下面的代码是我根据一些猜测得出的,不太确定它是否有效。通常,对于带有 .to-many 的查询子句,我需要多次尝试和错误NSPredicate

var predicates = [NSPredicate]()
predicates.append(NSPredicate(format: "SUBQUERY(colours, $colour, ANY $colour.rgb = 13576743).@count > 0"))
let cal = NSCalendar.currentCalendar()
if let xDaysAgo = cal.dateByAddingUnit(.Day, value: -2, toDate: NSDate(), options: []) {
    let midnightXDaysAgo = cal.startOfDayForDate(xDaysAgo)
    predicates.append(NSPredicate(format: "SUBQUERY(picks, $pick, ALL $pick.pickTime < %@).@count > 0", midnightXDaysAgo))
}
Run Code Online (Sandbox Code Playgroud)