CoreData - 从一对多的关系中选择特定的条目

问题描述:

该死的简短标题! :PCoreData - 从一对多的关系中选择特定的条目

基本上我有一个名为“线程”的实体,我有一个名为“邮件”的实体。我有一个来自线程的一对多关系 - >>消息(以及一对一的反向关系)。

我需要做的是从线程实体中获取所有记录,并为每个需要获取带有最新时间戳的消息(这只是“lastUpdated”属性中的一个int,所以最高数字I猜测就足够了)。

我不知道,你可能想要什么其他的信息,这里是我的实体的截图:

alt text

我敢肯定,必须有一个更好的办法不是通过所有的记录和迭代比较threadIds?

谢谢。

+0

我一直有意在我的应用程序中做这样的事情,但**不知何故**保持忘记张贴在这里问。 – BoltClock 2010-12-01 09:59:05

+0

是的,通常情况下我只是比较线程ID,但是这个项目很大程度上依赖于核心数据,所以我认为我会努力学习如何使它高效并学习关系等方面的一切。尽管如此,无法找到关于核心数据的许多信息。 :( – 2010-12-01 10:02:25

一旦你的个人Thread对象,你只需要做的消息的对象排序,并采取最上面的Message对象。

最简单的解决办法是在Thread类像这样来创建一个方法:

- (Messages *) lastUpdatedMessage{ 
    NSSortDescriptor *sort=[NSSortDescriptor sortDescriptorWithKey:@"lastUpdated" ascending:NO]; 
    NSArray *sortedMessages=[self.messagesInThread sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]]; 
    return [sortedMessages objectAtIndex:0]; 
} 

然后,所有你需要做的就是要求其lastUpdatedMessage每个Thread对象。

一个更复杂的,但更有效的解决方案是创建将一个消息对象链接到一个线程对象并作为消息对象更新设置链接对象的中间联的实体。所以:

MessageThreadLink{ 
    message<--(required)-->Message.lastUpdateLink 
    thread<--(required)-->Thread.lastUpdatedMessage 
} 

每当一个Message对象更新时,它会告诉它相关的线程对象,删除现有的链接对象然后再创建一个指向它。您可能会将该代码放入lastUpdated属性的自定义设置器中。

使用此方法,您只需要向每个线程询问其lastUpdatedMessage,并且它会自动显示,而无需进行大量搜索和排序。

你就不能使用NSPredicate对数据进行过滤和属性,你需要像你一个简单的数据库执行查询值? (或者也许我错过了点)

+0

我可以做,但接下来最重要的是什么?!我原以为会有办法通过关系访问实体 – 2010-12-01 10:33:19

+0

我想你是曲解了关系或者我误解了你:)关系只是一个面向对象的抽象概念模型(如ER/EER)中的_relationship_,因此您可以通过集合(NSSet)和关键路径评估来访问参与关系的项目。因此,最有效的方法是让Core Data在给定当前数据模型的情况下使用Predicate获取所需内容。也许你可以改变数据模型,因为Rog建议获得更多的性能 – rano 2010-12-01 10:47:34

所以你LASTUPDATED属性是一个int,而不是NSDate的?如果是这样,它是否必须是一个int,并且你是否对存储在该属性中的数据进行了其他操作?

我在想你可以使用BOOL属性来标记消息为lastUpdated == YES,然后你需要做的就是获取符合该谓词的消息实体。您仍然可以通过一对一关系访问线程实体,以便您可以按照自己想要的方式获取并显示该数据。作为一个方面说明,我认为你可能会发现使用单数词来命名实体更直观,因为每个线程实体包含一个线程,并且每个消息实体包含一条消息。

或选项2

改变你的LASTUPDATED属性是NSDate的和现在这样每当实体创建与当前日期/时间,将预填充设置的默认值。

然后为你保存每个线程,拉动相关消息,由NSDate的对它们进行排序并挑选阵列上的第一个对象,如果ASCENDING ==否,或在最后一个对象如果按升序排序== YES。