核心数据,与总计数明显地显示多对多关系

时间:2011-12-10 03:46:31

标签: ios core-data

我是Core Data的初学者,所以试着把我的想法包围在下面。

假设我有以下型号:

   Kid (1) -> (M) ToyName (car)
                  ToyAttributes (1) -> (M) key (color), value (black)
                                           key (price), value (20)
                                           key (store), value (toys r us)

ToyAttributes有3个键/值对。

我想要做的是清楚地列出颜色。所以,如果其他玩具也是黑色的,我只想展示一次黑色。

另一件好事是显示我们拥有多少黑色玩具的总数。

我目前有以下内容:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Kid" inManagedObjectContext:managedObjectContext_];

但不确定如何构建合适的KVC来找到合适的key = color并为每个孩子获取这些值。

1 个答案:

答案 0 :(得分:0)

您需要在您的实体上设置反向关系,然后如果您使用NSPredicate获取黑色实体,您将能够按照反向关系来检索所需的ToyName。

你最不想读这些:
Fetching Managed Objects
Predicate Format String Syntax


这是我得到的一些旧代码,不完美而且不完全符合您的要求,但仍然是使用NSPredicate的示例。
这是一个简单的NSFetchRequest,它将返回以某种方式排序的所有kListe实体。

- (NSFetchRequest *)requestPourListe{

NSFetchRequest *resultat = nil;

NSEntityDescription *description4Liste = 
[NSEntityDescription entityForName:kListe 
            inManagedObjectContext:self.managedObjectContext];
resultat = [[NSFetchRequest alloc] init];
[resultat setEntity:description4Liste];
[resultat setSortDescriptors:self.sortDescriptorsPourNom];
//  Si on veut faire un Fetch plus petit en mémoire (Partial Fault)
//[resultat setPropertiesToFetch:[NSArray arrayWithObject:kNom]];
return [resultat autorelease];
}
// Now time to use that request get the request
NSFetchRequest *requet4Liste = FRUtile.requestPourListe;
    NSError *monErreur = nil;
      // And Use it agains a NSManagedObjecContext (moc)
    NSArray *lesListes = [moc executeFetchRequest:requet4Liste
                                            error:&monErreur];

在下面的self.list中是使用前面的请求获取的NSManagedObject之一。

// those NSSet are set that were return from a simple relationship query
// so those set contain NSManagedObject
NSSet *desListeItems = self.liste.listeItems;
// HERE I'm fetching the relationship kRelationPrixElement on all NSManagedObject
// present in the set desListeItems (one to one relationShip)
NSSet *desPrixElements = [desListeItems valueForKey:kRelationPrixElement];
// generate the path, traverse the relationship call kRelationCommerce and 
// reach it's attribute name kNom
NSString *predicateKey = [NSString stringWithFormat:@"%@.%@", kRelationCommerce, kNom];
// get an array out of one set probably not necessary
NSArray *desPrixElementsAR = [desPrixElements allObjects];
NSMutableArray *lesPrixAAfficher = [[NSMutableArray alloc] initWithCapacity:0];
for (NSString *value in self.commercesNoms) {
            // in a predicate with format %K MUST be the key or keyPath and 
            // %@ MUST be the value you are searching for
            // the predicate here is done agains a many-to-one relation
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%K MATCHES %@)", predicateKey, value];
            // Now I'm applying the predicate to the array
    [lesPrixAAfficher addObjectsFromArray:[desPrixElementsAR filteredArrayUsingPredicate:predicate]];
}

在设计模型和获取请求时必须考虑到一件事,您可以在许多实体的关键路径中遵循关系,因为这些关系是to one关系。 您不能使用keyPath来遍历多对多关系,因为Core Data如何知道它应该遵循哪个实体。
最后,当你有一个NSManagedObject时,你可以在它上面使用点符号来检索它的属性和关系。