繁体   English   中英

如何从NSFetchedResultsController获取唯一对象?

[英]How to get unique objects from NSFetchedResultsController?

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

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

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

在这里,我只想显示一个名称为Daniel Higgins的条目。 如何基于idexvalue从NSFetchedResultsController过滤出唯一对象。

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

这样就不可能获得其他属性,例如number,否则它们将再次变得不同,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)

或者改为按照您的建议使用Controller,从而利用其委托并在即将发生更改时得到通知:

    let controller = NSFetchedResultsController(
        fetchRequest: request,
        managedObjectContext: context,
        sectionNameKeyPath: nil,    // just for demonstration: nil = dont split into section
        cacheName: nil              // and nil = dont cache
    )

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM