2 votes

Extraire les données de base en fonction du nombre d'entités de la relation.

Je suis nouveau dans Core Data et je ne sais pas comment écrire une requête comme celle-ci en utilisant Core Data.

J'ai deux entités Album et Songs dans le schéma. Album est lié à Song par une relation de type one-to-many et le nom de la relation est tracks. J'ai écrit une requête pour récupérer tous les albums et cela fonctionne bien. Mais maintenant je veux apporter un petit changement pour ne pas obtenir d'albums ayant 0 chanson. J'ai essayé de définir un prédicat sur la requête comme

tracks.@count != 0 
tracks.@count != nil

mais cela ne fonctionne pas peut-être à cause du pré-chargement ?. Est-ce que je dois précharger la relation ou quelque chose. Je ne veux pas ajouter d'attribut songCount dans Album et j'ai juste besoin du compte de chansons. Quelle est la meilleure façon d'écrire une requête comme celle-ci ? Merci d'avance !

Code -

NSFetchRequest *request = [[NSFetchRequest alloc] init];
 request.entity = [NSEntityDescription entityForName:@"Album" inManagedObjectContext:[self managedObjectContext]];
 NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
 [request setSortDescriptors:[NSArray arrayWithObject:sort]];  
 NSPredicate *albumPredicate = [NSPredicate predicateWithFormat:@"tracks.@count > 0"];
 [request setPredicate:albumPredicate];

C'est ce que j'ai obtenu sur la console après avoir activé le mode Debug

CoreData: sql: SELECT 0, t0.Z_PK FROM ZALBUM t0 WHERE (SELECT COUNT(*) FROM ZTRACK t1 WHERE (t0.Z_PK = t1.ZALBUM) ) > ? ORDER BY t0.ZNAME COLLATE NSCollateNoCase 

Qu'est-ce qui ne va pas dans le code ?

2voto

gasparuff Points 1469

Avez-vous essayé ceci :

[NSPredicate predicateWithFormat:@"tracks.@count>0"];

MODIFICATION :

Essayez d'activer SQLDebug et jetez un œil à la requête SQL générée. Vous trouverez la requête dans la console lorsque votre fetchrequest est effectué. Voici comment faire : Ajoutez -com.apple.CoreData.SQLDebug 1 aux arguments passés au lancement (sous "Modifier le schéma...")

0voto

Dev2rights Points 1802

MODIFIÉ : Cela récupérera tous les albums de votre magasin qui n'auront pas 0 chansons/pistes

NSFetchRequest *fetchRequestItems = [[NSFetchRequest alloc] init];
NSEntityDescription *entityList = [NSEntityDescription entityForName:@"Albums" inManagedObjectContext:managedObjectContext];
[fetchRequestItems setEntity:entityList];

[fetchRequestItems setPredicate:[NSPredicate predicateWithFormat:@"tracks.@count != 0 "]];

//Trier par dernière modification
NSArray *sortDescriptors = [NSArray arrayWithObjects:nil];
[fetchRequestItems setSortDescriptors:sortDescriptors];

NSUInteger count = [managedObjectContext countForFetchRequest:fetchRequestItems error:nil];

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