我有什么
消息实体
user | text | date
----------------------------------------------
user1 | This is first message user 1 | 10:50 **
user2 | This is first message user 2 | 10:50 **
user3 | This is first message user 3 | 10:50 **
user1 | This is second message user 1 | 10:00
user4 | This is first message user 4 | 10:00 **
user2 | This is second message user 2 | 10:00
user3 | This is second message user 3 | 10:00
user1 | This is third message user 1 | 9:00
...
有了这些数据,我想在单个获取请求中使用 CoreData 获取每个不同用户的第一条消息。
也就是
user1|This is the first message user 1|10:50
user2|This is the first message user 2|10:50
user3|This is the first message user 3|10:50
user4|This is the first message user 4|10:00
您可以通过首先抓取不同的用户,然后使用谓词为每个用户执行提取请求来实现这一点,但它会以大量“查询”结束(在本例中为 5 个)。如果可以在单个请求中完成,那就太好了。
谢谢!
最佳答案
我会向您的用户实体添加一个名为“lastMessage”之类的关系,无论您何时插入新消息,您都将始终保持最新状态。那么问题就变得微不足道了。
根据我的经验,与尝试创建非常复杂的查询相比,稍微非规范化您的架构以提高性能更容易。
编辑以显示实体:
------------- 1 R1 * ------------
|User Entity|<----------->| Message |
------------- ------------
| name |------------>| text |
------------- R2 1 | date |
------------
您有两个实体 - 用户和消息。在实体之间设置 2 个关系:
R1 - 'messages' 双向一对多(一个用户有很多消息,一个消息属于一个用户)
R2 - 'lastMessage' 单向一对一(一个用户有最后一条消息)
每当您添加新消息时,请使 R2 保持最新。
要获取所有用户的最后一条消息,请对所有用户执行提取请求,然后查看 R2 关系。
在 NSFetchRequest 上使用 setPropertiesToFetch: 在一次访问数据库的过程中填充 R2 关系。
关于iphone - 使用 Core Data 获取按日期时间排序的第一个不同实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7615650/