Базовые данные, отчетливо отображают отношение ко многим вместе с совокупным количеством - PullRequest
0 голосов
/ 10 декабря 2011

Я новичок в базовых данных, поэтому пытаюсь сосредоточиться на следующем:

Допустим, у меня есть следующая модель:

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

ToyAttributes имеет 3 ключа / значениепары.

Что я хочу сделать, так это четко перечислить цвета.Так что, если другие игрушки тоже черного цвета, я хочу отображать черный только один раз.

Еще одна хорошая вещь, которую нужно сделать, это отобразить общее количество черных игрушек у нас.

Iв настоящее время есть следующее:

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

Но не знаете, как структурировать правильный KVC, чтобы найти правильный ключ = цвет и получить эти значения для каждого ребенка.

1 Ответ

0 голосов
/ 10 декабря 2011

Вам необходимо установить обратное отношение на вашем Entity, тогда, если вы используете NSPredicate для извлечения черного, вы сможете следовать обратному отношению для получения желаемого ToyName.

Вы минимально хотите прочитать эти:
Извлечение управляемых объектов
Синтаксис строки формата предиката


Это какой-то старый код, который я получил, не идеальный и не совсем то, что вы ищете, но все еще пример использования 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]];
}

Есть одна вещь, которую вы должны принять во внимание при разработке своей модели и запроса на выборку, вы можете отслеживать отношения в keyPath во многих сущностях, КАК ДОЛГО КАК эти отношения to one отношения.
Вы не можете использовать keyPath для обхода отношения ко-многим, потому что как Core Data может узнать, за какой сущностью следует следовать.
И, наконец, когда вы получили NSManagedObject, вы можете использовать точечную запись на нем, чтобы получить его свойства и отношения.

...