WWDC ResearchKit+CareKit添加ORKTextChoice后提取答案报错
问题解决:ResearchKit单选问卷答案提取失败及数值存储方案
问题根源
- 结果类型不匹配:滑动量表的结果是
ORKScaleQuestionResult,但单选问卷的结果是ORKChoiceQuestionResult,原代码仅提取scaleResults,导致无法找到单选答案,触发断言失败。 - 标识符赋值错误:最后给
breathValue的kind赋值时,错误使用了睡眠项的标识符,会导致后续数据分类混乱。
修复代码
修改extractAnswersFromCheckInSurvey函数如下:
static func extractAnswersFromCheckInSurvey( _ result: ORKTaskResult) -> [OCKOutcomeValue]? { guard let response = result.results? .compactMap({ $0 as? ORKStepResult }) .first(where: { $0.identifier == checkInFormIdentifier }), // 同时提取滑动量表和单选问卷的结果 let scaleResults = response.results?.compactMap({ $0 as? ORKScaleQuestionResult }), let choiceResults = response.results?.compactMap({ $0 as? ORKChoiceQuestionResult }), let painAnswer = scaleResults .first(where: { $0.identifier == checkInPainItemIdentifier })? .scaleAnswer, let sleepAnswer = scaleResults .first(where: { $0.identifier == checkInSleepItemIdentifier })? .scaleAnswer, // 从单选结果集中获取选中值 let breathAnswer = choiceResults .first(where: { $0.identifier == TextChoiceQuestionStep })? .choiceAnswers?.first as? NSNumber else { assertionFailure("Failed to extract answers from check in survey!") return nil } var painValue = OCKOutcomeValue(Double(truncating: painAnswer)) painValue.kind = checkInPainItemIdentifier var sleepValue = OCKOutcomeValue(Double(truncating: sleepAnswer)) sleepValue.kind = checkInSleepItemIdentifier var breathValue = OCKOutcomeValue(Double(truncating: breathAnswer)) // 修正为单选问卷的标识符 breathValue.kind = TextChoiceQuestionStep return [painValue, sleepValue, breathValue] }
关键修改说明
- 新增
choiceResults提取单选类型的问卷结果,与scaleResults分开处理 - 通过
choiceAnswers?.first获取单选选中的数值(单选场景下只会有一个选中值) - 将
breathValue.kind修正为TextChoiceQuestionStep,确保数据存入CareKit时分类正确,后续可直接用于图表生成
内容的提问来源于stack exchange,提问作者Fitz
相关产品推荐
相关产品推荐

