[英]NSFetchRequest: Return dictionary with nested arrays of dictionaries
實體:名稱,類別,日期,值
我查詢的結果字典應該是:
{
Date1: [
{
Category1,
TotalValueOfCategory1InDate1
},
{
Category2,
TotalValueOfCategory2InDate1
},
...
]
Date2: [
{
Category1,
TotalValueOfCategory1InDate2
},
{
Category2,
TotalValueOfCategory2InDate2
},
...
]
...
}
我試過這個查詢:
let expr = NSExpressionDescription()
expr.name = "total"
expr.expression = NSExpression(format: "@sum.amount")
expr.expressionResultType = .doubleAttributeType
let expressions: [AnyObject] = ["category" as AnyObject, expr]
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "EntityName")
request.resultType = .dictionaryResultType
request.propertiesToGroupBy = ["date", "category"]
request.propertiesToFetch = expressions
let res = getDictionaryFromRequest(request: request)
但結果是(顯然):
[["total": val, "date": date1, "category": category1], ["total": val, "date": date1, "category": category2], ["total": val, "date": date2, "category": category1], ["total": val, "date": date2, "category": category2], ...]
要使用此數據結構,我應該為每個日期進行嵌套循環,以恢復具有相同日期的其他類別的值...
我看不出有任何方法可以用不同的表達式來解決這個問題,因為這是group by的工作方式,因此除非其他可能更了解NSExpressionDescription
在這里有解決方案,否則這是返回的當前結果的“解決方案”。
var dict: [String: [[String: Any]]] = [:]
for item in res {
if let date = item["date"] as? String,
let category = item["category"] as? String,
let total = item["total"] as? Int {
let newItem: [String: Any] = ["category": category, "total": total]
if dict.contains(where: { $0.key == date }) {
dict[date]?.append(newItem)
} else {
dict[date] = [newItem]
}
}
}
PS我測試時很懶,所以我的日期和類別項目都是字符串DS
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.