基本上我有一个名为“threads”的实体,我有一个名为“messages”的实体。我与线程有一对多的关系 - >>消息(以及一对一的反向关系)。
我需要做的是从线程实体获取所有记录,并且每个我需要获取具有最新时间戳的消息(这只是“lastUpdated”属性中的int,所以我猜的最高数字就足够了。)
我不确定您可能想要的其他信息,这是我的实体的屏幕截图:
我确信必须有比迭代所有记录和比较threadIds更好的方法吗?
谢谢。
答案 0 :(得分:3)
一旦拥有了各个Thread对象,您只需要对Messages对象进行排序并获取最顶层的Message对象。
最简单的解决方案是在Thread类中创建一个方法,如下所示:
- (Messages *) lastUpdatedMessage{
NSSortDescriptor *sort=[NSSortDescriptor sortDescriptorWithKey:@"lastUpdated" ascending:NO];
NSArray *sortedMessages=[self.messagesInThread sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
return [sortedMessages objectAtIndex:0];
}
然后你要做的就是向每个Thread对象询问lastUpdatedMessage。
更复杂但更有效的解决方案是创建一个中间链接实体,该实体将一个Message对象链接到一个Thread对象,并在Message对象更新时设置该链接对象。所以:
MessageThreadLink{
message<--(required)-->Message.lastUpdateLink
thread<--(required)-->Thread.lastUpdatedMessage
}
每当Message对象更新时,它都会告诉它相关的Thread对象删除现有的链接对象并创建指向它的另一个链接对象。您可能会将该代码放在lastUpdated属性的自定义setter中。
使用此方法,您只需要询问每个线程的lastUpdatedMessage,它会自动显示,而无需进行大量搜索和排序。
答案 1 :(得分:0)
您是否只能使用NSPredicate对您需要的数据和属性值执行过滤,就像在简单数据库上执行查询一样? (或者我可能错过了一点)
答案 2 :(得分:0)
那么你的lastUpdated属性是一个int而不是NSDate?如果是这样,它是否必须是一个int,你对该属性中存储的数据做了什么吗?
我原以为你可能会使用BOOL属性将消息标记为lastUpdated == YES,然后您需要做的就是获取与该谓词匹配的Message实体。您仍然可以通过一对一的关系访问线程实体,这样您就可以按照自己的方式获取和显示该数据。
[编辑] 作为旁注,我认为您可能会发现使用单数词来命名实体更直观,因为每个Thread实体包含一个线程,每个消息实体包含一个消息。
或选项2
将您的lastUpdated属性更改为NSDate并设置NOW的默认值,因此无论何时创建实体,它都会预先填充当前日期/时间。
然后,对于您保存的每个线程,拉出相关消息,按NSDate对它们进行排序,如果ASCENDING == NO,则选择数组中的第一个对象;如果ASCENDING == YES,则选择最后一个对象。