Подзапрос CoreData с несколькими условиями, отношениями - PullRequest
1 голос
/ 20 октября 2011

Первый постер, давний читатель / искатель!

Я пытаюсь вернуть информацию из подзапроса через отношение CoreData «один ко многим». У меня есть две сущности: Клиенты и Сообщения. Каждый клиент может иметь несколько сообщений.

Я пытаюсь вернуть номер счета из таблицы «Клиенты» для каждого клиента, у которого есть сообщение типа «Temp-Stop» с датой вступления в силу, которая меньше даты завтрашнего дня.

Я пытался использовать комбинации ЛЮБОЙ и НЕТ, без подзапросов, но обнаружил, что они работают не так, как я хотел. Наконец, я прибег к подзапросу.

Как показано ниже, он возвращает количество клиентов с прошедшими временными остановками, но вместо этого мне нужен номер счета этих клиентов. Чтобы было ясно, конечная цель состоит в том, чтобы определить, есть ли у клиента также сообщение типа «Перезапуск» до завтрашней даты. Это означает, что они больше не останавливаются и должны быть включены в список активных клиентов.

(изображение здесь, но я не могу опубликовать его, потому что я новый пользователь)

NSPredicate *predTemps = [NSPredicate predicateWithFormat:@"SUBQUERY(messages, $m, $m.effective < %@ && $m.type == 'Temp Stop').@count > 0", tomorrow];

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

NSPredicate *predTemps = [NSPredicate predicateWithFormat:@"SUBQUERY(messages, $m, $m.effective < %@ && $m.type == 'Temp Stop').account", tomorrow];

Это было бы именно то, что я хочу - это не работает, хотя. Мне не ясно, как именно реализовать подзапросы, поэтому, возможно, есть и другое решение.

Большое спасибо!

1 Ответ

1 голос
/ 21 октября 2011

Поскольку ваш запрос является только фильтрацией по атрибутам в сущности Message, есть ли причина, по которой вы не запускаете предикат непосредственно для сущности Message вместо ее «родительского»?

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

Это даст вам доступ к учетной записи через возвращенные Message экземпляры.

Помните, что Core Data - это граф объектов, а не база данных. Таким образом, вы хотите возвращаться и работать с объектами (сообщениями) вместо столбцов (учетных записей). Как только вы вернете объект обратно, вы сможете извлечь из него значение учетной записи.

UPDATE

Это псевдокод, объясняющий, что я имею в виду.

NSManagedObjectContext *moc = ...;
NSDate *effectiveDate = ...;
NSError *error = nil;
NSFetchRequest *request = nil;
NSPredicate *pred = nil;

request = [NSFetchRequest fetchRequestWithEntityName:@"Message"];
pred = [NSPredicate predicateWithFormat:@"effective < %@ && type == 'Temp Stop'", effectiveDate];
[request setPredicate:pred];

NSArray *results = [moc executeFetchRequest:request error:&error];
NSAssert2(!error || results, @"Error fetching results: %@\n%@", [error localizedDescription], [error userInfo]);

NSArray *customers = [results valueForKey:@"customer"];

return customers;
...