Swift 3中无需匹配值获取Core Data特定属性总数量的方法
获取Core Data中某属性的所有值并统计数量
嘿,我来帮你搞定这个需求!既然你已经会用谓词匹配特定值,那要跳过匹配限制、拿到某属性的所有值并统计数量其实很简单,下面分步骤给你讲清楚:
1. 获取某属性的所有值
如果不想用匹配值,直接去掉谓词就行!而且为了效率,我们可以只请求需要的属性,不用把整个实体对象都加载到内存里。比如你要拿Likes实体中name属性的所有值,代码可以这么写:
// 创建针对Likes实体的获取请求,指定返回字典类型 let fetchRequest = NSFetchRequest<NSDictionary>(entityName: "Likes") // 明确只获取name属性 fetchRequest.propertiesToFetch = ["name"] // 设置结果类型为字典,这样只会返回我们需要的属性数据 fetchRequest.resultType = .dictionaryResultType do { // 执行请求,得到包含name属性的字典数组 let results = try context.fetch(fetchRequest) // 从字典里提取出所有name值,转成字符串数组 let allNames = results.compactMap { $0["name"] as? String } print("所有name属性值:\(allNames)") } catch { print("获取属性值失败:\(error.localizedDescription)") }
2. 统计属性值的总数量
统计数量分两种场景,看你具体需求:
场景一:统计所有属性值的总数(包含重复)
如果只是要算总共有多少个属性值(不管重复),有两种高效的方式:
- 要是已经拿到了上面的
allNames数组,直接取count就行:let totalCount = allNames.count print("name属性值的总数量:\(totalCount)") - 要是不需要实际的属性值,只想统计数量,直接用Core Data的计数请求更省内存:
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Likes") do { let totalCount = try context.count(for: fetchRequest) print("总数量:\(totalCount)") } catch { print("统计失败:\(error.localizedDescription)") }
场景二:统计去重后的属性值数量
如果要统计有多少个不同的属性值(比如重复的name只算一次),可以用分组请求实现自动去重:
let fetchRequest = NSFetchRequest<NSDictionary>(entityName: "Likes") fetchRequest.propertiesToFetch = ["name"] fetchRequest.resultType = .dictionaryResultType // 按name属性分组,自动去除重复值 fetchRequest.propertiesToGroupBy = ["name"] do { let groupedResults = try context.fetch(fetchRequest) let uniqueNameCount = groupedResults.count print("去重后的name数量:\(uniqueNameCount)") } catch { print("统计去重数量失败:\(error.localizedDescription)") }
小提醒
你之前的代码里如果加了predicate,现在要获取所有值的话,直接把fetchRequest.predicate = ...这行删掉就可以啦!用propertiesToFetch的方式能大幅减少内存占用,数据量大的时候优势特别明显。
内容的提问来源于stack exchange,提问作者Iam Wayne
相关产品推荐
相关产品推荐

