【问题标题】:How to get distinct results from a single field in Core Data (Swift 4)如何从 Core Data (Swift 4) 中的单个字段中获得不同的结果
【发布时间】:2018-03-07 17:21:25
【问题描述】:

我正在尝试从“LogLine”表中的“flightNumber”字段中获取所有值的不同列表。但是我尝试过的所有操作都导致获取请求返回完整的航班号列表,并带有重复项。

我已经关注了这些问题的答案:

Swift Core Data - Request with distinct results

Swift 3 - NSFetchRequest Distinct Results

但似乎无法让它工作。这是我的代码:

func fetchUniqueFlightNumbers() -> [[String: Int16]]? {
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "LogLine")
    request.resultType = NSFetchRequestResultType.dictionaryResultType
    request.returnsDistinctResults = true
    request.propertiesToFetch = ["flightNumber"]

    do {
        let results = try persistenceContainer.viewContext.fetch(request) as! [[String: Int16]]
        return results
    } catch {
        print("Couldn't read flight numbers from DB \(error)")
        return nil
    }
}

我得到的结果是:

[["flightNumber": 1], ["flightNumber": 1], ["flightNumber": 2], ["flightNumber": 2]]

我想得到结果 [1,2] 但我得到 [1,1,2,2]。

属性“flightNumber”是一个整数 16。

我的代码有问题吗,或者在 Swift 4 中发生了什么变化?

编辑:

我意识到我只是在测试中看到这种行为,当我的持久存储配置为 NSInMemoryStoreType 时。所以这不是什么大问题,我只需要重新考虑这部分代码的单元测试。我很好奇为什么我会看到两种商店类型之间的这种行为差异。

【问题讨论】:

  • 看起来确实正确。 flightNumber 属性是什么类型的?
  • flightNumber 是一个 Int16
  • 那时不知道,我尝试了同样的事情,得到了预期的结果。
  • 感谢您的测试。我今天再次尝试,并意识到我只在测试中看到这种行为,当使用内存中持久存储时。当我使用默认商店时,它按预期工作
  • 我看到了同样的事情。我建议提交一个错误。

标签: swift core-data swift4


【解决方案1】:

@Chris.B 我看到你的帖子有点旧但没有解决。我刚刚遇到了类似的问题,但使用了FethchedResultController,我发现了很多。您遇到的问题是您没有使用.propertiesToGroupBy,这是您想要不同结果的属性。这是一个强制性的NSFetchRequest 属性,必须使用它才能获得不同的结果。要获得完整的见解,请检查我对自己问题的回答,以及非常详细的分步指南。 Removing duplicate objects from fetch based on object parameter UPDATED Swift 希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2015-03-18
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    相关资源
    最近更新 更多