CoreData Fetch谓词,用于不相关的实体

时间:2012-06-20 07:00:24

标签: core-data ios5 nspredicate

我无法为不相关的实体执行CoreData提取请求。让我们假设我有一个包含3个实体的对象模型:MessageUserAdvisor

我希望这三个对象彼此无关。因此,Message确实具有属性senderEmailreceiverEmail,而UserAdvisor具有属性email。 但同样,这些对象之间没有进一步的关系 我现在想要例如由顾问或用户获取最新的(最新的)Message。但是,如果没有连接对象,我该怎么做这个获取谓词呢?

这在一个获取请求中是否可能,或者我是否需要将每个对象分别提取到一个数组中,然后进行进一步操作以获得我想要的内容?

1 个答案:

答案 0 :(得分:1)

亚历山大,

如果这些实体彼此不相关,则需要执行不同的获取请求以获取数据。

因此,举例来说,您可以抓住最新的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元素。

为什么需要将这些实体分开?

希望有所帮助。