Swift核心数据 - 请求具有不同的结果

Max*_*xim 4 sqlite core-data objective-c nsfetchrequest swift

我如何在swift中使用不同的值调用es请求?

这是我的代码:

let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let context: NSManagedObjectContext = appDelegate.managedObjectContext

    let request = NSFetchRequest(entityName: "MedicalData")
    request.propertiesToFetch = NSArray(object: "docID")
    request.returnsObjectsAsFaults = false
    request.returnsDistinctResults = true

    var results:NSArray = context.executeFetchRequest(request, error: nil)

    for data in results {
        var thisData = data as MedicalData
        println(thisData.docID)
    }
Run Code Online (Sandbox Code Playgroud)

我想获得"docID"的不同值,但我获得了所有实体:(

谢谢你的帮助!

Mun*_*ndi 6

你需要设置

request.resultType = NSFetchRequestResultType.DictionaryResultType
Run Code Online (Sandbox Code Playgroud)

它返回字典,但不同的过滤器应该有效.

如果你不想沿着那条路走下去,请在内存中过滤(也推荐).然后进行正常的提取

let distinct = NSSet(array: results.valueForKeyPath("docID") as [String])
Run Code Online (Sandbox Code Playgroud)

使用Swift 2.0我更喜欢

let distinct = NSSet(array: results.map { $0.docID })
Run Code Online (Sandbox Code Playgroud)

  • 我实际上建议不要采用获取所有结果的方法,然后将它们通过NSSet进行管道处理,就像它那样,获取并实例化所有对象,只是为了抛弃其中的一些.通过将resultType设置为将在sqlite级别执行所有过滤并实例化更少的对象,可以更好地修复他当前正在采用的方法.如果将docID编入索引,则更是如此. (3认同)

Yed*_*edy 5

如前所述,关键是使用

fetchRequest.resultType = NSFetchRequestResultType.DictionaryResultType
Run Code Online (Sandbox Code Playgroud)

fetchRequest.propertiesToFetch = ["propertyName"]
Run Code Online (Sandbox Code Playgroud)

两者都是不同的工作所必需的

fetchRequest.returnsDistinctResults = true
Run Code Online (Sandbox Code Playgroud)

下一步是将结果作为 Swift Dictionaries 处理并返回所需的值。

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let managedContext = appDelegate.managedObjectContext!
    //FetchRequest
    let fetchRequest = NSFetchRequest(entityName: "Purchase")
    fetchRequest.propertiesToFetch = ["year"]
    fetchRequest.resultType = NSFetchRequestResultType.DictionaryResultType
    fetchRequest.returnsDistinctResults = true
    //Fetch
    var error: NSError?
    if let results = managedContext.executeFetchRequest(fetchRequest, error: &error)  {
        var stringResultsArray: [String] = []
        for var i = 0; i < results.count; i++ {
            if let dic = (results[i] as? [String : String]){
                if let yearString = dic["year"]?{
                    stringResultsArray.append(yearString)
                }
            }
        }
        return stringResultsArray
    }else {
        println("fetch failed: \(error?.localizedDescription)")
    }
    return []
Run Code Online (Sandbox Code Playgroud)