iphone - 使用 Core Data 获取按日期时间排序的第一个不同实体

标签 iphone ios core-data

我有什么

消息实体

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/

相关文章:

iphone - 如何在加载了 nib 文件的 UIView 中调整 subview 的大小

iphone - 您可以使用PhoneGap在iPhone上录制音频吗?

ios - 创建子类 C4Shapes(C4 框架)时获取未声明的标识符

ios - 使用 NSPredicate 按日期过滤核心数据不返回任何内容

ios - 在后台线程上执行核心数据保存?

ios - 自定义类型Core Data属性问题

iphone - Xcode 不会释放资源文件

iphone - Safari 阅读器有 API 吗?

ios - 框架/libswiftAVFoundation.dylib : valid provisioning profile for this executable was not found

iphone - 停止 UIGestureRecognizer 调用选择器