3 votes

CoreData - sélectionner une entrée spécifique dans une relation de type "un à plusieurs".

Maudits soient les titres courts ! :p

En gros, j'ai une entité nommée "threads" et une entité nommée "messages". J'ai une relation de un à plusieurs de fils ->> messages (et une relation inverse de un à un).

Ce que j'ai besoin de faire, c'est de récupérer tous les enregistrements de l'entité threads et pour chacun d'entre eux, j'ai besoin de récupérer le message avec le dernier horodatage (c'est juste un int dans l'attribut "lastUpdated", donc le plus grand nombre je suppose suffira).

Je ne sais pas quelles autres informations vous souhaitez obtenir, mais voici une capture d'écran de mes entités :

alt text

Je suis sûr qu'il doit y avoir un meilleur moyen que d'itérer à travers tous les enregistrements et de comparer les threadIds ?

Merci.

3voto

TechZen Points 52692

Une fois que vous avez les objets Thread individuels, il vous suffit de faire un tri sur les objets Messages et de prendre l'objet Message le plus élevé.

La solution la plus simple serait de créer une méthode dans la classe Thread comme ceci :

- (Messages *) lastUpdatedMessage{
    NSSortDescriptor *sort=[NSSortDescriptor sortDescriptorWithKey:@"lastUpdated" ascending:NO];
    NSArray *sortedMessages=[self.messagesInThread sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
    return [sortedMessages objectAtIndex:0];
}

Il suffit ensuite de demander à chaque objet Thread son lastUpdatedMessage.

Une solution plus complexe mais plus efficace consisterait à créer une entité de liaison intermédiaire qui relierait un objet Message à un objet Thread et qui définirait cet objet de liaison lors de la mise à jour des objets Message. Ainsi :

MessageThreadLink{
    message<--(required)-->Message.lastUpdateLink
    thread<--(required)-->Thread.lastUpdatedMessage
}

Chaque fois qu'un objet Message est mis à jour, il demande à l'objet Thread qui lui est lié de supprimer l'objet lien existant et d'en créer un autre qui pointe vers lui. Vous devriez probablement mettre ce code dans un setter personnalisé pour la propriété lastUpdated.

Avec cette méthode, il suffit de demander à chaque fil son lastUpdatedMessage et il apparaît automatiquement sans qu'il soit nécessaire de faire beaucoup de recherche et de tri.

0voto

rano Points 3094

Ne pouvez-vous pas simplement utiliser NSPredicate pour effectuer un filtre sur les valeurs de données et d'attributs dont vous avez besoin comme vous le feriez pour une requête sur une simple base de données ? (ou peut-être qu'un point m'échappe)

0voto

Rog Points 12427

Votre attribut lastUpdated est donc un int et non NSDate ? Si c'est le cas, doit-il être un int et faites-vous autre chose avec les données stockées dans cet attribut ?

Je pensais que vous pourriez éventuellement utiliser un attribut BOOL qui marque un message comme lastUpdated == YES et ensuite tout ce que vous avez à faire est de récupérer vos entités Message qui correspondent à ce prédicat. Vous serez toujours en mesure d'accéder à l'entité thread via la relation biunivoque, ce qui vous permettra d'extraire et d'afficher ces données comme vous le souhaitez.

[modifier] En passant, je pense que vous trouverez plus intuitif d'utiliser des mots singuliers pour nommer vos entités, car chaque entité Thread contient un fil et chaque entité message contient un message.

OU Option 2

changez votre attribut lastUpdated en NSDate et définissez la valeur par défaut pour NOW, de sorte que chaque fois que l'entité est créée, elle sera préremplie avec la date/heure actuelle.

Ensuite, pour chaque fil que vous avez sauvegardé, récupérez les messages associés, triez-les par NSDate et choisissez le premier objet du tableau si ASCENDING == NO ou le dernier objet si ASCENDING == YES.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X