Affichage de données CoreData

BenjoBenjo Membre

Bonjour !


 


Je viens tout juste de me mettre à  CoreData et j'ai un petit problème d'affichage de données. En fait, je dois afficher mes données dans un tableView. Le problème est que des données s'affichent mais pas sous la forme voulue. Par exemple, dans mes cellules j'obtiens un résultat du type "<NSManagedObject: 0xaa60640> (entity: Objectifs; id: 0xaa41430 <x-coredata://E5B09703-C716-4A8D-B761-6A8777FE8D35/Objectifs/p7> ; data: <fault>)". Ce n'est pas vraiment le résultat attendu...


 


Je pense que le problème ne vient pas de la façon dont je fait chercher mes données mais plutôt de comment je les affichent. Voici mon code :


Lorsque j'ajoute :



-(void)ajouter {

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@Objectifs inManagedObjectContext:context];
NSManagedObject *nouvelObjectif = [[NSManagedObject alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:context];

[nouvelObjectif setValue:@Test forKey:@titre];

NSError *error;
[context save:&error];

[tableau reloadData];

NSLog(@Objectif ajouté);
}

Lorsque je lis les données :



-(NSArray *)donnees {

NSEntityDescription *entity = [NSEntityDescription entityForName:@Objectifs inManagedObjectContext:context];
NSFetchRequest *requete = [[NSFetchRequest alloc] init];

[requete setEntity:entity];

NSError *error;

NSArray *liste = [context executeFetchRequest:requete error:&error];

return liste;
}

Et enfin l'affichage dans une cellule :



-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@%d, objectifs.count);
static NSString *identifiant = @identifiant;
Cellule *cell = [tableView dequeueReusableCellWithIdentifier:identifiant];

//Configuration de la cellule
//Récupération des données
objectifs = [[NSArray alloc] initWithArray:[self donnees]];

cell.objectif.text = [NSString stringWithFormat:@%@",[objectifs objectAtIndex:indexPath.row]];
NSLog(@%@",[objectifs objectAtIndex:indexPath.row]);
return cell;
}

Voilà . Si quelqu'un a une idée je suis ouvert à  toutes vos propositions !


 


Merci d'avance :)


Mots clés:

Réponses

  • Il faut simplement formatter l'affichage, par exemple



    cell.objectif.text = [NSString stringWithFormat:@titre : %@",[[objectifs objectAtIndex:indexPath.row]] valueForKey:@titre];
     
  • BenjoBenjo Membre

    Merci beaucoup jpimbert ça marche super bien ! Je ne savais pas comment il fallait le faire. Merci beaucoup :)


  • AliGatorAliGator Membre, Modérateur

    Ton tableau retourné par la méthode -(NSArray*)donnees est un tableau d'objet NSManagedObject. Donc forcément, [objectifs objectAtIndex:indexPath.row] va te retourner un NSManagedObject. Si c'est directement ce NSManagedObject que tu affectes comme text de ton UILabel, c'est normal qu'il te mette ce texte barbare (c'est le résultat de l'appel à  la méthode "description" sur l'objet NSManagedObject, comme d'habitude quand on NSLog(@%@) par exemple)


     


    Ce qu'il te faut faire c'est récupérer le NSManagedObject d'un côté dans une variable par exemple, et ensuite afficher précisément ce que tu veux afficher dans le text de ton UILabel. Par exemple, je sais pas moi, la propriété "titre" de ton NSManagedObject (à  toi de voir ce que tu veux afficher après tout, il ne va afficher que ce que tu lui demandes !)

    Objectifs* obj = [objectifs objectAtIndex:indexPath.row];
    cell.objectif.text = obj.titre;

     


    ----


     


    Une fois que ça marchera et que tu auras résolu ton problème, pense à  corriger ton code concernant les performances et la réutilisabilité. En particulier :


     - faire appel à  chaque fois dans cellForRowAtIndexPath à  la méthode [self donnees] qui va fetcher TOUTES les données, c'est violent !! Ca veut dire qu'à  chaque fois qu'une cellule a besoin d'être affichée, pour chaque cellule (y compris quand tu scroll et qu'elles sont réutilisées), à  chaque fois tu vas récupérer TOUTES les données en refaisant appel à  [self donnees]... tout ça pour à  la fin n'en utiliser qu'une seule à  chaque fois ! Il faut mieux quand tu veux recharger les données de stocker le résultat de [self donnees] dans une @property(strong) une fois pour toutes, et taper dans ce tableau à  chaque fois, plutôt que de reconstruire tout le tableau pour chaque cellule à  remplir !


     - En plus créer un NSArray* objectifs à  partir de ce même tableau retourné par [self donnees] est totalement inutile : [self donnees] retourne déjà  un tableau, quel intérêt d'en construire un autre et demander de le remplir avec le premier, à  part gaspiller du temps d'exécution et de la mémoire ?


     - Enfin, une fois que tu auras bien compris tous ces principes, il sera temps de te plonger dans NSFetchedResultController, qui t'automatise tout ça, gère le cache, la pagination des données pour éviter de devoir TOUT récupérer et d'optimiser la requête (genre si un jour tu as 50000 objectifs, plutôt que de les récupérer tous d'un coup, les mettre de côté, puis taper dans le tableau des 50000 NSManagedObjects, il va ne récupérer disons que les 100 premiers, et quand tu vas scroller et t'approcher du 100e, il va récupérer les suivants en tâche de fond, etc... tout ça totalement automatisé par NSFetchedResultController ! Il y a pas mal de doc et de tutos qui trainent sur le net, je te laisse regarder


  • BenjoBenjo Membre

    Merci AliGator pour tous tes conseils ! Je vais aller regarder tout ça ! Comme je viens de m'y mettre je connais pas encore grand chose c'est super sympa merci ! :)


    Après tout ce qui est optimisation du code, le projet que j'ai fait c'était un test donc fait plutôt vite fait donc j'ai pas trop fait attention :)


Connectez-vous ou Inscrivez-vous pour répondre.