Swift Core Data - Request with distinct results

前端 未结 3 1030
天涯浪人
天涯浪人 2021-01-03 03:08

how I can call es request with distinct values in swift?

This is my code:

let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate a         


        
相关标签:
3条回答
  • 2021-01-03 03:16

    You need to set

    request.resultType = NSFetchRequestResultType.DictionaryResultType
    

    It returns dictionaries, but the distinct filter should work.

    If you do not want to go down that route, filter in memory (also recommended). Do a normal fetch and then

    let distinct = NSSet(array: results.valueForKeyPath("docID") as [String])
    

    With Swift 2.0 I prefer

    let distinct = NSSet(array: results.map { $0.docID })
    
    0 讨论(0)
  • 2021-01-03 03:24

    As already mentioned the key is using

    fetchRequest.resultType = NSFetchRequestResultType.DictionaryResultType
    

    and

    fetchRequest.propertiesToFetch = ["propertyName"]
    

    both are required for distinct to work

    fetchRequest.returnsDistinctResults = true
    

    The next step is to deal with the results as Swift Dictionaries and returning the wanted values.

    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 []
    
    0 讨论(0)
  • 2021-01-03 03:31

    NSPredicate will allow you to search for specific values and retrieve only the data you need from core data:

      var StoredResults = [NSManagedObject]()
    
      func fetchRequest(docID : String ){
    
            let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            let managedContext = appDelegate.managedObjectContext
            let request = NSFetchRequest(entityName: "EntityContainingDocID")
    
            let predicate =  NSPredicate(format:"docID == %@", docID)
            request.predicate = predicate
    
        do {
            let results =
            try managedContext.executeFetchRequest(request)
    
            StoredResults = results as! [NSManagedObject]
    
            } catch let error as NSError {
                  print(" error executing fetchrequest  ", error)
            }
        }
    

    In this example we are only looking to return specific values matching a string in the "docID" column but NSPredicate is a handy way of building SQL-like queries into your code and is pretty flexible.

    0 讨论(0)
提交回复
热议问题