【问题标题】:Parsing NSDictionary result of grouped by fetch request in Core Data解析核心数据中按获取请求分组的NSDictionary结果
【发布时间】:2017-11-27 07:05:40
【问题描述】:

我需要使用 CoreData 从表中获取一些统计信息。我使用this 手册使用“分组依据”表达式提取数据。

这是我的源代码:

var popularGuestNames: [String] = []
        let keypathExp = NSExpression(forKeyPath: "guestName")
        let expression = NSExpression(forFunction: "count:", arguments: [keypathExp])

        let countDesc = NSExpressionDescription()
        countDesc.expression = expression
        countDesc.name = "count"
        countDesc.expressionResultType = .integer64AttributeType

        let request = NSFetchRequest<NSFetchRequestResult>(entityName: "GuestsTable")
        request.returnsObjectsAsFaults = false
        request.propertiesToGroupBy = ["guestName"]
        request.propertiesToFetch = ["guestName", countDesc]
        request.resultType = .dictionaryResultType

        let matchedGuests = try? context.fetch(request)
        guard matchedGuests != nil else {return popularGuestNames}

但结果我得到了类型为 [Any] 的匹配客人。我被困在这里。我可以使用 print 看到有 JSON 对象:

Optional(
[{
    count = 1;
    guestName = "\U0412\U0430\U043d\U044f";
}, {
    count = 13;
    guestName = "\U0413\U043e\U0441\U0442\U044c 1";
}, {
    count = 9;
    guestName = "\U0413\U043e\U0441\U0442\U044c 2";
}, {
    count = 3;
    guestName = "\U0413\U043e\U0441\U0442\U044c 3";
}, {
    count = 1;
    guestName = "\U0413\U043e\U0441\U0442\U044c 4";
}, {
    count = 1;
    guestName = "\U0413\U043e\U0441\U0442\U044c 5";
}, {
    count = 1;
    guestName = "\U041d\U043d\U043d";
}, {
    count = 1;
    guestName = "\U0422\U0435\U0441\U0442";
}, {
    count = 1;
    guestName = "\U0422\U0435\U0441\U0442 \U0442\U0435\U0441\U0442\U043e\U0432\U0438\U0447";
}, {
    count = 1;
    guestName = "\U0423\U0410\U0443\U043f\U0430\U0438\U0443\U0430\U0433\U0443";
}])

但我找不到解析它的方法。我知道我应该使用 JSONSerialization.jsonObject,但是这种方法需要数据类型的输入变量。而且我无法理解如何将 Any 转换为 Data。

【问题讨论】:

  • matchedGuests 是一个字典数组:[[String:Any]]Any 是键 guestName 的字符串,我猜是 Intcount
  • 正如我从编辑器看到的:让matchedGuests:[Any]? .如何使用它?

标签: ios json swift core-data


【解决方案1】:

首先,Core Data 获取的结果绝对是不是 JSON 对象

其次更具体!

由于获取请求的返回类型显然是字典使用泛型类型传递NSDictionary

let request = NSFetchRequest<NSDictionary>(entityName: "GuestsTable")

然后将类型相应地转换为实际类型[[String:Any]]

var matchedGuests = [[String:Any]]()
...
if let result = try? context.fetch(request) as! [[String:Any]] {
   matchedGuests = result
} 

即使发生try? 错误,假设提取请求有效,强制解包返回类型也不会导致崩溃。


如果您只想要客人姓名map 数组

let popularGuestNames = matchedGuests.flatMap { $0["guestName"] as? String }

【讨论】:

  • 完美!非常感谢。只剩下一个不相关的问题。您能建议如何使用 SortDescriptor 添加列“计数”吗?如果我使用排序描述符,它会失败 request.sortDescriptors = [NSSortDescriptor(key: "count", ascending: true)]
  • 我不知道NSExpression 对获取请求有何影响,但您可以在获取后对数组进行排序:matchedGuests.sorted(by: {$0["count"] as! Int &lt; $1["count"] as! Int})
【解决方案2】:

matchedGuests 是一个字典数组,或[[String:Any]]。要使用它,您可以使用 for in 循环遍历它。

for dic in matchedGuests {
    //Dic will be a dictionary in the array with key value pairs.
    print(dic["count"])
    print(dic["guestName"])
    .... do more work with results.
}

如果您知道它的类型,则使用 Any 的值将其转换为字符串。

let string = dic["guestName"] as? String

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多