您可以使用 NSPredicate 指定“从...中选择唯一名称”吗?

Posted

技术标签:

【中文标题】您可以使用 NSPredicate 指定“从...中选择唯一名称”吗?【英文标题】:Can you specify "select unique name from ..." with NSPredicate? 【发布时间】:2009-12-11 05:47:18 【问题描述】:

我在 Core Data 中存储了一些数据,如下所示:

|姓名 |标识符 |其他的东西|

我需要在 UITableView 中显示名称,但我只想显示具有唯一名称-标识符对的名称。所以对于:

John | 3 | foo
Betty | 4 | foo
Betty | 4 | bar

我只希望查询返回 John,Betty。类似于“从表中选择唯一名称、标识符”。

使用 NSPredicate 有什么方法可以做到这一点,还是我需要将重复数据删除的字段倒入不同的容器中,然后在上面搜索?

【问题讨论】:

【参考方案1】:

Core Data 是一个 object 图管理框架,它恰好(可选地)将该对象图持久保存到 SQL 持久存储中。无法查询对象属性,只能查询对象。然后,您可以从结果数组中查询实例:

NSArray *instances; //from -[NSManagedObject executeFetchRequest:error:]
NSArray *uniqueNames = [instances valueForKeyPath:@"@distinctUnionOfObjects.name"];

假设名称在 name 属性中。

如果您希望每个用户拥有一个名称、一个 id 和多个 foo,bar,...,那么您应该将这种情况建模为具有名称和 id 以及一对多关系的用户实体到一个代表 foo/bar/etc 的实体。

您可以在键值编码指南的Collection Operators 部分找到有关@distinctUnionOfObjects(和其他集合运算符)的更多信息。

【讨论】:

【参考方案2】:

由于这是核心数据,请查看-[NSFetchRequest setReturnsDistinctObjects:]

【讨论】:

以上是关于您可以使用 NSPredicate 指定“从...中选择唯一名称”吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NSFetchedRequest 或 NSPredicate 从实体中选择所有行?

NSPredicate 通过 NSSet 搜索

使用 NSPredicate 在单个搜索 iOS swift 中搜索多个单词

在 coredata 中过滤 Vs NSPredicate

NSPredicate - 使用两个条件进行评估

从核心数据中获取