предикат ко многим многим отношениям основных данных - PullRequest
0 голосов
/ 26 сентября 2011

У меня есть две сущности в базовой модели данных, подобные этим: A <<--->> B.
У сущности B есть имя атрибута, которое является строковым объектом, и отношение AObjects к A;вместо этого сущность A имеет отношение BObjects к B.
Теперь я хочу получить список всех BObjects, связанных с сущностью A, а затем я хочу показать их имена в метке.

Возможно ли это?Я знаю, что CoreData не поддерживает отношения «многие ко многим» ...
Спасибо!

Ответы [ 2 ]

2 голосов
/ 02 октября 2011

Я думаю, что вы, возможно, не полностью описали свою ситуацию, потому что, конечно, Core Data действительно поддерживает отношения «многие ко многим». Я подозреваю, что вы можете иметь в виду, что NSFetchedResultsController не поддерживает отношения «многие ко многим»? Насколько я смог определить, это правильно. ( Редактировать : можно использовать NSFetchedResultsController с отношениями "многие ко многим" ... это просто не очень понятно, как это сделать.)

Чтобы сделать это без NSFetchedResultsController, идентифицируйте / извлеките интересующий вас объект A, а затем просмотрите интересующие вас отношения. Итак, если вы уже знаете, что заинтересованы в конкретном объекте A, который я буду вызывать theAObject, с именами классов A и B, вы можете просто обойти отношения, используя точечный синтаксис и быстрое перечисление, используя что-то вроде следующего:

for (B *theBObject in theAObject.BObjects) {
    NSLog(@"theBObject.name: %@.", theBObject.name);
    // Run whatever code you want to here on theBObject.
    // This code will run once for each B Object associated with theAObject 
    // through the BObjects relationship.
}

В качестве альтернативы, вы можете настроить запрос на выборку, чтобы получить набор интересующих вас AObject-ов, а затем пересечь отношение BOjects для каждого из них. Не имеет значения, что это отношение многие ко многим ... каждый AObjecct будет возвращать все объекты B, которые находятся в его отношении BObjects.

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

NSString *myLabel = null;
// You may of course want to be declaring myLabel as a property and @synthesising
// it, but for the sake of a complete example we'll declare it here which means 
// it will only have local scope.

for (B *theBObject in theAObject.BObjects) {
    myLabel = [myLabel stringByAppendingString:theBObject.name];    
    // Add a line break in the string after each B object name.
    myLabel = [myLabel stringByAppendingString:@"\n"];
}

// Do something with your myLabel string to set your desired label.
0 голосов
/ 26 сентября 2011

Вы можете попробовать предикат, подобный этому:

NSPredicate * fetchPredicate = [NSPredicate ultimateateWithFormat: @ "any AObjects =% @", [NSManagedObjectID для A]];

...