Ho un NSPredicate
che include più filtri aggregati, che genera un'eccezione.NSPredicate su più to-molti relazioni in Core Data
Ho il seguente modello di dati di base:
voglio scegliere quelli ApparelItems
per i quali una delle colours
ha un rgb
di 13.576.743, e per la quale tutti i picks
avere un pickTime
precedenza di un dato NSDate
.
Il mio codice per creare il predicato è:
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)
ottengo la seguente eccezione:
Exception name=NSInvalidArgumentException, reason=Unsupported predicate (ANY colours.rgb == 13576743) AND ALL picks.pickTime < CAST(479347200.000000, "NSDate")
ho provato:
Ogni predicato individuale funziona bene. Vale a dire
ANY colours.rgb = ...
opere, anche opereALL picks.pickTime < ...
. Semplicemente non funzionano se combinati nella stessa query.Combinare i due utilizzando in una singola query, collegata a
AND
, anziché utilizzareNSCompoundPredicate
. Il risultato è lo stesso.
È possibile che i dati di base semplicemente non supportino il filtraggio su più di una relazione to-many? Sembra strano. In tal caso come dovrei fare quanto sopra?
Una possibile via d'uscita, a seconda della cardinalità delle tabelle nelle domande, sarebbe quella di effettuare il filtraggio più selettivo nei dati di base il secondo in memoria usando 'filteredArrayUsingPredicate' –
Grazie ... d'accordo è possibile, ma è possibile sembra davvero inefficiente. Per prima cosa (anche se non è mostrato nel codice sopra, che è una versione semplificata) in realtà sto solo chiedendo i dati di base per il suo 'ManagedObjectId's. Quindi non ho effettivamente gli oggetti su cui lavorare. Di nuovo, è ovviamente qualcosa che potrei cambiare, ma l'ho fatto in questo modo per mantenere basso l'utilizzo della memoria. – HughHughTeotl
hai provato a utilizzare la sottoquery? – Wain