2011-03-11 2 views
1

J'utilise un NSPredicate avec quelques constructions <= pour extraire des objets d'un magasin de données de base avec un attribut startDate entre 2 dates mais je reçois 0 objets récupérés .NSPredicate fetch Objets de données de base avec l'attribut dates dans la plage de dates NSDate

Voici mon NSPredicate:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"((%@ <= %K) && (%K <= %@))", fromDate, @"startTime", @"startTime", toDate]; 

est ici la sortie de la console:

predicate: CAST(336261600.000000, "NSDate") <= startTime AND startTime <= CAST(339285599.000000, "NSDate") 
[sectionInfo numberOfObjects]: 0 

Voici les dates qui sont des données de base (le type d'attribut est défini à ce jour):

startTime 
--------- 
337249800 
337309200 
337318200 

fromDate et toDate sont tous les deux NSDate objets. J'ai essayé de les remplacer par distantPast et distantFuture pour être complètement sûr que mes attributs Core Data startTime sont dans la plage de dates et que je reçois toujours 0 objet récupéré.

Je ne sais pas pourquoi 0 objets sont retournés. Quelqu'un peut-il voir où je vais mal?

Répondre

0

Après avoir regardé le SQL généré des requêtes, il est apparu comme le TIMESTAMP était évalué comme une chaîne et non un entier. Cela explique pourquoi mon prédicat ne fonctionnait pas. J'ai confirmé cela en exécutant la requête SQL suivante sur la base de données SQLite que j'utilise pour pré-remplir les données de base.

SELECT DISTINCT typeof(ZSTARTTIME) FROM ZMATCH; 

Cela a montré que le champ TIMESTAMP était de type BLOB!

Ajout de '+ 0' à mon prédicat afin que l'attribut startTime ait été évalué comme un nombre entier résolu le problème. Cependant, cela semblait être une mauvaise solution. Garder également les dates stockées comme des blobs serait très probablement causer des problèmes plus loin sur la route. Donc je suis retourné et j'ai re-peuplé la base de données SQLite à partir de zéro en m'assurant que les TIMESTAMP ont été insérés comme des entiers et non comme des chaînes. Maintenant tout fonctionne bien.

Cependant, cela signifie que je vais devoir travailler davantage avec la prochaine mise à jour de l'application car je devrai m'assurer que la mise à jour remplace l'ancienne base de données SQLite dans le dossier Documents avec la nouvelle base de données. Y a-t-il un moyen facile de faire cela? Dois-je regarder la migration du magasin Core Data ??

2

Je commencerais en ajoutant l'argument exécutable suivant:

-com.apple.CoreData.SQLDebug 1 

Cela va cracher une ligne de gigajazillion des informations de débogage sur la console lorsque vous exécutez votre application, mais il devrait aussi inclure des informations sur la prédiquer sa tentative de traduction en SQL, et peut-être même pourquoi cela ne fonctionne pas.

Vous voulez évidemment tourner supprimer ce avant l'expédition de votre application :)

+0

Merci Dave, cela m'a aidé à bien régler le problème (voir ma réponse) :-) – mattvick

+0

@MattVick: Content que vous l'ayez compris. La façon dont nous montrons nos remerciements est en upvoting les réponses à vos questions que vous avez trouvé utile. –