2017-02-22 1 views
0

J'ai une application qui a plusieurs entrées de temps avec une date enregistrée comme NSDate.Filtre fetchRequest pour l'année/mois en utilisant NSPredicate

Je voudrais utiliser une requête d'extraction pour filtrer une année et un mois donnés d'un autre endroit. Comment puis-je utiliser NSPredicate pour filtrer pendant un an et un mois?

let predicate = NSPredicate(format: "%K == %D && %K == %D", ???, selectedMonth, ???, selectedYear) 

Mise à jour

Utilisation de l'aide Raki a fait remarquer que je suis venu avec le code suivant:

var dateComp = DateComponents() 
dateComp.year = Int(selectedYear) 
dateComp.month = Int(selectedMonth) 
dateComp.day = 1 

let calendar = Calendar.current 
let firstDayOfTheMonth = calendar.date(from: dateComp) 

var oneMonth = DateComponents() 
oneMonth.month = 1 
let beginningOfNextMonth = calendar.date(byAdding: oneMonth, to: firstDayOfTheMonth!) 

Et le prédicat:

let predicate = NSPredicate(format: "date >= %@ AND date < %@", firstDayOfTheMonth as! CVarArg, beginningOfNextMonth as! CVarArg) 

Je reçois un SIGABRT avec le message suivant:

Could not cast value of type 'Foundation.Date' (0x1073a0ae0) to 'Swift.CVarArg' (0x1196851c8). 

Xcode m'a suggéré d'ajouter "as! CVarArg »

Mise à jour 2

Le prédicat suivant travaillé maintenant:

let predicate = NSPredicate(format: "%K >= %@ && %K < %@", "date", firstDayOfTheMonth! as NSDate, "date", beginningOfNextMonth! as NSDate) 
+0

Quel est le format de date que vous enregistrez? – raki

+0

J'utilise NSDate. Dans CoreData, tapez 'Date'. – sidetrax

+0

il peut aider: http://stackoverflow.com/questions/13262567/how-to-build-a-nspredicate-filtering-all-days-in-a-month-using-nsdate – raki

Répondre

0

Vous ne pouvez pas prédicat comme ça, mais vous pouvez créer deux Dates de votre mois et l'année qui commence le jour du mois et fin jour du mois.

maintenant, vous devez tout simplement comme prédicat de cette façon.

let predicate = NSPredicate(format: "%K >= %@ && %K <= %@", "DateAttribute", startDateOfMonth as NSDate, "DateAttribute", endDateOfMonth as NSDate) 

Edit: Si vous ne savez pas comment créer la date de startDateOfMonth et endDateOfMonth, vous pouvez créer à l'aide DateComponents.

let selectedMonth = 11 
let selectedYear = 2015 
var components = DateComponents() 
components.month = selectedMonth 
components.year = selectedYear 
let startDateOfMonth = Calendar.current.date(from: components) 

//Now create endDateOfMonth using startDateOfMonth 
components.year = 0 
components.month = 1 
components.day = -1 
let endDateOfMonth = Calendar.current.date(byAdding: components, to: startDate!) 
+0

Merci pour votre aide. Je l'ai créé moi-même pendant que vous tapiez ...: P Mais j'aime components.day = -1. Je ne le savais pas. – sidetrax

+0

@ user7259583 Cela fonctionne-t-il maintenant, obtenez-vous le résultat souhaité? –

+0

@ user7259583 Vérifiez la réponse éditée et avec le type de prédicat cast 'Date' à' NSDate'. comme 'startDateOfMonth as NSDate' –