不相关实体的CoreData Fetch Predicate
Posted
技术标签:
【中文标题】不相关实体的CoreData Fetch Predicate【英文标题】:CoreData Fetch Predicate for unrelated entities 【发布时间】:2012-06-20 07:00:23 【问题描述】:我无法为不相关的实体执行 CoreData 提取请求。假设我有一个包含 3 个实体的对象模型:Message
、User
和 Advisor
。
我希望这 3 个对象彼此无关。所以Message
确实有属性senderEmail
和receiverEmail
而User
和Advisor
确实有属性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
实体添加一个名为insertionDate
(NSDate
类型)的属性,允许您按日期排序。
当你执行请求时
NSArray* results = [messageFetch executeFetchRequest:&error];
数组results
将包含(仅)您要查找的Message
元素。
为什么您需要维护单独的这些实体?
希望对您有所帮助。
【讨论】:
谢谢!我需要单独维护这些实体,因为我的模型包含比上述三个更多的实体。我不想拥有一个包含所有实体之间关系的巨大网格模型。所以我认为将一些关系建模为获取的属性可能会更好...... @Alexander 不客气,如果您发现日期建议有用,也请点赞。 :-)以上是关于不相关实体的CoreData Fetch Predicate的主要内容,如果未能解决你的问题,请参考以下文章
CoreData Fetch (Sort by Date) - 不更新新数据?
NSPredicate 未在 CoreData 中返回 Int32