如何从NSFetchedResultsController获取唯一对象?

时间:2018-03-01 13:03:39

标签: ios swift core-data nsfetchedresultscontroller

我有一个实体Contact,它有重复的联系对象。 例如:

|---------------------|------------------|---------------|
|     Name            |    Index Value   |   Number      |
|---------------------|------------------|---------------|
|  Daniel Higgins     |         4        |    12345      |
|---------------------|------------------|---------------|
|  Daniel Higgins     |         4        |    123456789  |

现在我在这里使用NSFetchedResultsController获取联系人并将其用于UITableviewController。

在这里,我想只显示名字Daniel Higgins的一个条目。 如何根据idexvalue从NSFetchedResultsController中过滤掉唯一对象。

2 个答案:

答案 0 :(得分:1)

您可以像这样创建您的请求(其中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
    )

答案 1 :(得分:0)

创建fetchResultsController请求对象时,对其应用谓词以根据所需名称过滤掉条目。

然后,当您使用context.fetch(request)获取对象时,如果有多个条目,您只需使用第一个。