我有一个实体联系人,它有重复的联系对象。例如:
|---------------------|------------------|---------------|
| Name | Index Value | Number |
|---------------------|------------------|---------------|
| Daniel Higgins | 4 | 12345 |
|---------------------|------------------|---------------|
| Daniel Higgins | 4 | 123456789 |
现在我在这里使用NSFetchedResultsController获取联系人并将其用于UITableviewController。
在这里,我想只显示名字Daniel Higgins的一个条目。如何根据idexvalue从NSFetchedResultsController中过滤掉唯一对象。
创建fetchResultsController请求对象时,对其应用谓词以根据所需名称过滤输入条目。
然后,当你使用context.fetch(request)
获取对象时,如果有多个条目,你可以简单地使用第一个。
您可以像这样创建您的请求(其中ContactResult
是您从核心数据生成的类):
let request = NSFetchRequest<ContactResult>(entityName: "contacts")
request.propertiesToFetch = ["name"] // an array of properties between which should be distinguished
request.returnsDistinctResults = true // dont do duplicates
这样就不可能得到像数字这样的其他属性,否则它们会再次分明,Daniel Higgins会再次弹出两次。如果这实际上是你想要的(获取名称和至少一个数字(不关心哪个)),那么你也可以使用group by
:
let request = NSFetchRequest<ContactResult>(entityName: "contacts")
request.propertiesToGroupBy = ["name"] // an array of properties between which should be grouped if there are duplicates
警告:如果有多个数字被选中,可能不一致!
但是,您可以直接获取Mehul Parmar建议的结果:
context.fetch(request)
或者根据您的建议使用控制器,因此使用其代理并收到即将发生的变化的通知:
let controller = NSFetchedResultsController(
fetchRequest: request,
managedObjectContext: context,
sectionNameKeyPath: nil, // just for demonstration: nil = dont split into section
cacheName: nil // and nil = dont cache
)