Swift 4:如何从Core Data获取去重值显示在UIPickerView中?
解决Core Data获取去重值并显示在UIPicker的问题
我来帮你搞定这个问题——你当前代码里的returnsDistinctResults = true没起作用,是因为默认的Fetch Request是获取整个Calculation实体对象,而Core Data判断"重复"的依据是实体实例是否相同,不是某个属性的值是否重复。哪怕两个实体的目标属性值一样,它们也是不同的实例,所以去重逻辑不会生效。
下面是修改后的完整方案,你可以直接适配到你的代码里:
步骤说明
- 明确你要去重的目标属性(比如假设是
value字段,你需要替换成自己的属性名) - 通过
NSExpressionDescription指定只获取这个属性,让Core Data针对属性值做去重 - 调整Fetch Request的返回类型,以便提取去重后的属性值
修改后的代码
func CD_Fetch_Value_Database() { let context = getcontext() // 把泛型改成NSDictionary,因为我们要获取字典形式的结果 let fetchRequest = NSFetchRequest<NSDictionary>(entityName: "Calculation") fetchRequest.predicate = NSPredicate(format: "test= %@", cd_test) fetchRequest.returnsObjectsAsFaults = false fetchRequest.returnsDistinctResults = true // 配置要获取的去重属性 let distinctProperty = NSExpressionDescription() distinctProperty.name = "distinctValue" // 自定义结果字典中的key // 替换成你实际要去重的属性名,比如"yourTargetProperty" distinctProperty.expression = NSExpression(forKeyPath: "yourTargetProperty") // 根据你的属性类型调整,比如字符串用.stringAttributeType,数字用.int32AttributeType distinctProperty.expressionResultType = .stringAttributeType fetchRequest.propertiesToFetch = [distinctProperty] fetchRequest.resultType = .dictionaryResultType // 指定返回字典类型 do { let fetchedResults = try context.fetch(fetchRequest) // 提取去重后的属性值到数组,类型和你设置的保持一致 Value_Database = fetchedResults.compactMap { $0["distinctValue"] as? String } // 刷新UIPicker的数据源 yourPickerView.reloadAllComponents() } catch let error as NSError { print("获取去重数据失败: \(error.localizedDescription), \(error.userInfo)") } }
关键注意点
- 替换代码中的
yourTargetProperty为你实际需要去重的属性名称(比如你要显示在Picker里的那个字段) - 根据属性类型调整
expressionResultType和数组转换的类型:如果是整数,就把.stringAttributeType改成.int32AttributeType,同时as? String改成as? Int - 确保
Value_Database的类型和你提取的属性类型一致,这样才能作为UIPicker的数据源正常使用
内容的提问来源于stack exchange,提问作者JosWico
相关产品推荐
相关产品推荐

