Основные данные: 3 таблицы соединения? - PullRequest
6 голосов
/ 27 сентября 2010

Я знаю, что Core Data не является базой данных, и есть много различий.Это один?

В базе данных у меня обычно было бы следующее

A - >> B - >> C

"A" имеет много "B", котороеимеет много "C"

Запрос "Дайте мне все A, которые имеют c.attr = 'X', легко записывается как:

select * from a, b, c where a.id = b.aid and b.id = c.bid and c.attr = 'X'

В Core Data я хотел бысделать то же самое, но с использованием предиката, например:

NSPredicate *predicate = 
  [NSPredicate predicateWithFormat:@"ANY bs.cs.attr = %@", "X"];
[frequest setEntity:entityA];
[frequest setPredicate:predicate];

Это приводит к ошибке: «NSInvalidArgumentException», причина: «здесь не разрешено использование нескольких ключей ко многим»

Am IПравильно ли интерпретировать, что есть ограничение на то, что базы данных называют объединениями в несколько таблиц?

Я погуглил и не смог найти окончательный ответ.

Мое текущее решение этого запроса выглядит так:

NSPredicate *predicate = 
  [NSPredicate predicateWithFormat:@"ANY cs.attr = %@", "X"];
...
NSArray *bs = //execute fetch
for (B *b in bs) {
  //add b.a into an array
}
//return array

Есть ли лучший способ? Заранее спасибо за внимание.

Ответы [ 2 ]

8 голосов
/ 28 сентября 2010

Вы идете об этом задом наперед.

Прежде всего, вам не нужны идентификаторы связывания в Базовых данных, потому что все связанные объекты уже связаны этой связью.Это означает, что конструкции типа where a.id = b.aid and b.id = c.bid вообще не нужны.

Во-вторых, вы обычно устанавливаете объект выборки для объекта, который получает определяющий тест.В данном случае это c.attr="X" Итак, вы устанавливаете свою выборочную сущность на C, и ваш предикат должен выглядеть примерно так:

NSPredicate *p=[NSPredicate predicateWithFormat:@"attr=%@",xValue];

Это вернет массив всех экземпляров C, которые соответствуюттест.Тогда нахождение какого-либо конкретного B или A - это просто вопрос выбора отношений для каждого C.

Если ваше обратное отношение равно единице, например, A <- >> B <- >> C, вы просто спрашиваете у каждого C значение b.a, поэтому:

AObject *anA = aCinstance.b.a;

Важно помнить, что вы не имеете дело с таблицами здесь.Вы имеете дело с графом объектов.Вы устанавливаете выборку для определенной сущности и затем проходите отношения фильтрованных сущностей.

1 голос
/ 25 октября 2012

Возможно ли для основных данных добавить тесты для атрибутов как b, так и a?Или мне придется последовательно перебирать каждый набор результатов, чтобы получить окончательный результат?

select 
  p.id, p.total 
from 
  purcord p, line l, delivery d 
where 
  l.purcord_id = p.id
  and d.purcord_id = l.purcord_id
  and d.purcord_line_no = l.line_no
  and d.status = 'notdelivered'
  and l.status = 'open'
  and p.status = 'open'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...