2011-09-01 4 views
0

Je suis l'ajout d'un ListItem dans ListName (Il y a une relation un à plusieurs setted vers le haut) dans une classe ACore Data - Fetch ne délivre pas le même résultat

relationship

ListItem *newItem = [NSEntityDescription insertNewObjectForEntityForName:@"ListItem" 
inManagedObjectContext:self.context]; 
//setting some attributes... 

[listName addListItemsObject:newItem]; 
[self.context save:&error];  

Après que la classe B est via une méthode de délégué appelé

Là, je veux obtenir les données à partir des données de base, MAIS ... Si je récupère tout ListName, les articles ListItems ne sont pas à jour (par exemple seulement 5 articles au lieu de 6). Si je récupère tous les ListItems alors il y en a tous (6 sur 6).

Quel est le problème avec mon code ... Je dois obtenir tous si listes nomliste

NSError *error; 
NSFetchRequest *req = [[NSFetchRequest alloc] init]; 
if(context == nil) 
    NSLog(@"context is nil"); 

NSEntityDescription *descr = [NSEntityDescription entityForName:@"ListName" inManagedObjectContext:self.context]; 
[req setEntity:descr]; 

NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"lastModified" ascending:NO]; 

[req setSortDescriptors:[NSArray arrayWithObject:sort]]; 

NSArray * results = [self.context executeFetchRequest:req error:&error]; 

self.listNames = [results mutableCopy]; 
if ([results count] > 0) { 
    ListName *test = [results objectAtIndex:0]; 
    [test.listItems count]; 
    NSLog(@"item count on list %i", [test.listItems count]); 
    //wrong result 

    NSFetchRequest *newReq = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *descr = [NSEntityDescription entityForName:@"ListItem" inManagedObjectContext:self.context]; 
    [newReq setEntity:descr]; 

    NSArray * results2 = [self.context executeFetchRequest:newReq error:&error]; 
    NSLog(@"item count on items %i", [results2 count]); 
    //right result 

} 
+0

Je n'ai pas reçu votre question. – Robin

+0

Si je récupère sur listname, le nombre de listitems est de 5 au lieu de 6. Si je récupère sur ListItems alors c'est 6 – gabac

Répondre

0

Un simple reset a aidé

+0

N'utilisez pas la réinitialisation comme réinitialisation de contexte générique. Il est destiné à être utilisé avec le gestionnaire d'annulation. – TechZen

0

Compte tenu de votre modèle de données et de code, il n'y a aucune raison que le nombre de ListItems dans les deux endroits que soit le même chose parce que les comptes sont de deux ensembles différents d'objets qui ne se chevauchent pas nécessairement.

Le premier nombre est donné par le code suivant:

ListName *test = [results objectAtIndex:0]; 
[test.listItems count]; 

... qui renvoie le nombre de ListItems objets dans la relation d'un seul et unique objet particulier ListName. Vous pouvez avoir un objet ListName ou vous pourriez en avoir des centaines dont chacun pourrait avoir un nombre arbitraire d'objets connexes ListItems. Ce code ne comptera que ceux liés au premier objet ListName retourné.

Le deuxième chef d'accusation est donné par:

NSFetchRequest *newReq = [[NSFetchRequest alloc] init]; 
NSEntityDescription *descr = [NSEntityDescription entityForName:@"ListItem" inManagedObjectContext:self.context]; 
[newReq setEntity:descr]; 

NSArray * results2 = [self.context executeFetchRequest:newReq error:&error]; 
NSLog(@"item count on items %i", [results2 count]); 

... qui retourne un tableau non filtré contenant tous les cas de ListItems dans le magasin persistant indépendamment de ce que les relations qu'ils ont.

Il n'y a aucune raison particulière de s'attendre à ce que le premier compte concorde avec le second car il ne le fera que lorsque (1) vous avez un seul objet ListNames dans le magasin et (2) tout objet ListItems existant est dans ce ListNames.listNames relation.

Assurez-vous de ne pas confondre les entités et les objets gérés.

BTW, vous devriez presque toujours utiliser des relations réciproques, par ex. Si vous avez ListNames.listItems vous devriez avoir un ListItems.listName réciproque.

+0

thx beaucoup pour votre explication! – gabac