Problème CoreData
antoine2405
Membre
Bonjour,
J'ai un probléme au niveau de CoreData.
Voici mon schéma.
http://www.flickr.com/photos/mayous/3817738830/
Donc j'ai deux entité, "profil", "sauvegarde".
Un profil a plusieurs sauvegarde.
Sachant que chaque sauvegarde à une date, j'aimerai afficher dans un formulaire les dernière sauvegarde fait par utilisateurs.
Il faut savoir aussi que je stock dans la base de donnée chaque sauvegarde fait par un utilisateur
J'envisagait d'utiliser un predicate de max(date) mais se ne marche pas du tout ...
Avez vous une idée?
Merci d'avance
J'ai un probléme au niveau de CoreData.
Voici mon schéma.
http://www.flickr.com/photos/mayous/3817738830/
Donc j'ai deux entité, "profil", "sauvegarde".
Un profil a plusieurs sauvegarde.
Sachant que chaque sauvegarde à une date, j'aimerai afficher dans un formulaire les dernière sauvegarde fait par utilisateurs.
Il faut savoir aussi que je stock dans la base de donnée chaque sauvegarde fait par un utilisateur
J'envisagait d'utiliser un predicate de max(date) mais se ne marche pas du tout ...
Avez vous une idée?
Merci d'avance
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Par contre je ne vois pas comment il marche...
C'est sur que NSPredicate pour signifier "les 10 dernières dates", cela demande réflexion. Bien sur il y a toujours la solution de tout récupérer en une NSArray pour trier après.
Paresseusement, je regrouperais les entities dans une NSArray, puis un tri sortedArrayUsing..
Bref je suis plus partie sur un tripe un peu comme ca.
Bon maintenant je suis un peu perdu ^^ mais bon je vais bien trouver...
Sinon pour info antoine :
1) Quand tu peux, utilise les boucles de type NSFastEnumeration plutôt que les boucles for "à index" pour parcourir les collections genre NSArray : c'est plus rapide
2) Maintenant, je me demande si avec un KeyPath on ne peut pas demander directement l'objet ayant la date max ? un KP genre "date.@max" justement...?
Si pour le MAX, y a pas de problème, mais ici il faut les 10 derniers de la liste.
Pour sortedArray, voici un exemple :
Elle est pas du tout optimiser mais ca marche pour l'instant ^^
Alors merci AliGator pour le conseil...
En faite il y a la possibilité d'utiliser MAX mais il faut être dans une expressions et je ne savais pas trop comment m'y prendre.
petit link pour information :
http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSExpression_Class/Reference/NSExpression.html
c'est au niveau de expressionForFunction:arguments:
J'ai pas encore tout piger le principe au niveau des KeyPath.. pas encore l'habitude...
Bon Maintenant il faut que j'arrive a dire a ma requête de faire la liaison avec un "Profil".. parce qu'il me prend toutes les données qui sont présentes dans sauvegarde. Encore une question de ID quelque chose...
Je vais regardé ca de plus prés...
Si vous avez idée, je suis preneur hiii hiii ^^
Merci encore
Du coup pour avoir la sauvegarde qui a la plus grande (récente) date -- pour reprendre mon questionnement juste du "max" -- si tu construis une NSExpression avec le keyPath @date.@max", puis un NSPredicate utilisant cette NSExpression, tu devrais t'en sortir.
Maintenant, pour récupérer juste les 10 dernières, par contre, là ...
En SQL, je demanderais dans ma requête de trier les résultats par date décroissante, et limiterait le nombre de résultats à 10. En CoreData avec les NSPredicate, est-ce possible un truc comme ça...?
Il suffit d'utiliser un fetchLimit sur ta request donc aprés si tu en veux 10
ca devient:
Une petite idée pour faire la liaison avec la table profil ?
Par contre dans mon cas, je n'ai aucune envie de limité les résultats parce que dans le futur je vais en avoir besoin pour un graphique...
En passant si vous vous y connaissez en graphique avec l'iphone, j'aimerai bien des informations parce que je sens que je vais avoir mal ...
Oui enfin cela ne doit pas filtrer pas les 10 dates maximales, mais limiter le nombre de résultats à dix objets.
(NSArray * filteredArray=[array filteredArrayUsingPredicate:predicate]; à traduire en NSFetchRequest )
CoreData met en place un NSPersistentStoreCoordinator en intermédiaire avec la base de donnée. Il faut donc passer par les classe de CoreData pour "dialoguer" avec la bdd.
Ce forum présente une rubrique pour cela.
Voici le code :
Ca marche pour l'instant.
Merci les mecs pour l'aide ^^
Mais bon, de même, pourquoi plutôt qu'une boucle ne pas faire [tt][array valueForKeyPath:@date.@max"][/tt] ? (pas testé mais je vois pas pourquoi ça marcherait pas)
Par contre merci pour l'autre partie de code, c'est beaucoup plus proche et j'y avais même pas penser ^^
Sa Rocks