不相关实体的CoreData Fetch Predicate

Posted

技术标签:

【中文标题】不相关实体的CoreData Fetch Predicate【英文标题】:CoreData Fetch Predicate for unrelated entities 【发布时间】:2012-06-20 07:00:23 【问题描述】:

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

我希望这 3 个对象彼此无关。所以Message 确实有属性senderEmailreceiverEmailUserAdvisor 确实有属性email。 但同样,这些对象之间没有进一步的关系。 例如,我现在想通过顾问或用户获取最新的(新闻)Message。但是,由于对象未连接,我应该如何执行此获取谓词?

这甚至可以在一个 Fetch Request 中实现,还是我需要将每个对象分别提取到一个数组中,然后进行进一步的操作以获得我想要的?

【问题讨论】:

【参考方案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 实体添加一个名为insertionDateNSDate 类型)的属性,允许您按日期排序。

当你执行请求时

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

数组results 将包含(仅)您要查找的Message 元素。

为什么您需要维护单独的这些实体?

希望对您有所帮助。

【讨论】:

谢谢!我需要单独维护这些实体,因为我的模型包含比上述三个更多的实体。我不想拥有一个包含所有实体之间关系的巨大网格模型。所以我认为将一些关系建模为获取的属性可能会更好...... @Alexander 不客气,如果您发现日期建议有用,也请点赞。 :-)

以上是关于不相关实体的CoreData Fetch Predicate的主要内容,如果未能解决你的问题,请参考以下文章

CoreData Fetch (Sort by Date) - 不更新新数据?

收到 Fetch 请求后无法更新 CoreData 模型

NSPredicate 未在 CoreData 中返回 Int32

Swift CoreData NSPredicate

获取“最新”单个实体的最简单 Fetch 请求 - 核心数据

如何使用CoreData获取相关实体的对象?