【问题标题】:Swift Core Data - Request with distinct resultsSwift Core Data - 具有不同结果的请求
【发布时间】:2014-08-17 10:42:52
【问题描述】:

如何在 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)
    }

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

感谢您的帮助!

【问题讨论】:

    标签: objective-c sqlite core-data swift nsfetchrequest


    【解决方案1】:

    你需要设置

    request.resultType = NSFetchRequestResultType.DictionaryResultType
    

    它返回字典,但 distinct 过滤器应该可以工作。

    如果您不想走那条路,请在内存中过滤(也推荐)。做一个正常的提取,然后

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

    我更喜欢 Swift 2.0

    let distinct = NSSet(array: results.map { $0.docID })
    

    【讨论】:

    • 我实际上建议不要获取所有结果,然后将它们通过 NSSet 管道传输,因为它就是这样做的,获取并实例化所有对象,只是为了丢弃其中的一些。通过设置 resultType 来修复他当前采用的方法要好得多,因为这将在 sqlite 级别进行所有过滤并实例化更少的对象。如果 docID 被编入索引,则更是如此。
    • 原则上是正确的,但是如果没有太多数据,另一种方法更简单。即使这样,Core Data 也会针对内存使用进行优化,因此不必假设所有属性也都已获取。
    【解决方案2】:

    如前所述,密钥正在使用

    fetchRequest.resultType = NSFetchRequestResultType.DictionaryResultType
    

    fetchRequest.propertiesToFetch = ["propertyName"]
    

    两者都是 distinct 工作所必需的

    fetchRequest.returnsDistinctResults = true
    

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

    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 []
    

    【讨论】:

    • fetchRequest.returnsDistinctResults = true 不工作
    • 我们可以使用谓词吗?
    • 添加@Yedy 答案,使用FetchedResultsControllersimplify 一切。如果您需要使用结果填充TableView,请检查我的答案,因为我整理了一份必须遵循的强制性步骤的分步指南。 stackoverflow.com/questions/56168119/…
    【解决方案3】:

    NSPredicate 将允许您搜索特定值并仅从核心数据中检索您需要的数据:

      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)
            }
        }
    

    在本例中,我们只希望返回与“docID”列中的字符串匹配的特定值,但 NSPredicate 是一种在代码中构建类似 SQL 的查询的便捷方式,并且非常灵活。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 2018-08-18
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多