2012-06-20 3 views
0

У меня возникли проблемы с выполнением запроса выборки CoreData для несвязанных объектов. Предположим, что у меня есть объектная модель с тремя объектами: Message, User и Advisor.CoreData Fetch Predicate для несвязанных объектов

Я хочу, чтобы эти 3 объекта не были связаны друг с другом. Так что Message имеет атрибут senderEmail и receiverEmail, тогда как User и Advisor имеют атрибут email.
Но опять нет никаких дальнейших отношений между этими объектами.
Теперь я хочу, например, получить последний (новый) Message советником или пользователем. Но как мне сделать этот предикат fetch, поскольку объекты не связаны?

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

ответ

1

Александр,

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

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

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"senderEmail == %@", grabbedEmail]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"insertionDate" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 

NSFetchRequest *messageFetch = [[NSFetchRequest alloc] init]; 
[messageFetch setEntity:[NSEntityDescription entityForName:@"Message" inManagedObjectContext:yourContext]]; 
[messageFetch setPredicate:predicate]; 
[messageFetch setSortDescriptors:sortDescriptors]; 
[messageFetch setFetchLimit:1]; 

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

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"userId == %@", @"someUserId"]; 

NSFetchRequest* userFetch = [[NSFetchRequest alloc] init]; 
[userFetch setEntity:[NSEntityDescription entityForName:@"User" inManagedObjectContext:yourContext]]; 
[userFetch setPredicate:predicate]; 
[userFetch setFetchLimit:1]; 

NSArray* userResults = [userFetch executeFetchRequest:&error]; 

User* retrievedUser = (User*)[userResults objectAtIndex:0]; 
NSString* grabbedEmail = [retrievedUser email]; 

Для сортировки по дате можно просто добавить к Message enitity атрибут под названием insertionDate (типа NSDate), что позволяет упорядочить по дате.

Когда вы выполнить запрос

NSArray* results = [messageFetch executeFetchRequest:&error]; 

массив results будет содержать (только) Message элемент, который вы ищете.

Зачем вам нужно поддерживать отдельные эти объекты?

Надеюсь, что это поможет.

+0

Спасибо за это! Мне нужно поддерживать эти объекты отдельно, потому что моя модель состоит из многих других объектов, кроме трех выше. Я не хочу иметь огромную модель с привязкой между всеми объектами. Поэтому я подумал, что было бы лучше иметь некоторые отношения, смоделированные как выбранные свойства ... – Alexander

+0

@Alexander. Добро пожаловать, upvote тоже, если вы нашли полезный совет даты. :-) –

Смежные вопросы