查询 HKCategoryTypeIdentifierSleepAnalysis 的 HealthKit
Posted
技术标签:
【中文标题】查询 HKCategoryTypeIdentifierSleepAnalysis 的 HealthKit【英文标题】:Query HealthKit for HKCategoryTypeIdentifierSleepAnalysis 【发布时间】:2015-11-06 00:09:51 【问题描述】:我已经构建了一个导入睡眠样本的方法,但我无法让它返回正确的睡眠时间值。
查询睡眠数据的方法如下:
func updateHealthCategories()
let categoryType = HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis)
let start = NSDate(dateString:"2015-11-04")
let end = NSDate(dateString:"2015-11-05")
let categorySample = HKCategorySample(type: categoryType!,
value: HKCategoryValueSleepAnalysis.Asleep.rawValue,
startDate: start,
endDate: end)
self.hoursSleep = Double(categorySample.value)
print(categorySample.value)
日期格式如下:
extension NSDate
convenience
init(dateString:String)
let dateStringFormatter = NSDateFormatter()
dateStringFormatter.dateFormat = "yyyy-MM-dd"
dateStringFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
let d = dateStringFormatter.dateFromString(dateString)!
self.init(timeInterval:0, sinceDate:d)
我正在调用 11 月 4 日至 5 日的数据,其中包含以下数据:
但是,categorySample.value
返回 1
而不是 3
。
【问题讨论】:
【参考方案1】:您访问的值是类别样本值,HKCategoryType
,而不是睡眠小时数。
HKCategoryTypeIdentifierSleepAnalysis
的定义
typedef enum : NSInteger
HKCategoryValueSleepAnalysisInBed,
HKCategoryValueSleepAnalysisAsleep,
HKCategoryValueSleepAnalysis;
定义两个可能的值,0 或 1,其中 1 的值匹配 HKCategoryValueSleepAnalysisAsleep
。
要想睡好几个小时需要设置HKSampleQuery
。
代码如下所示:
if let sleepType = HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis)
let predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: .None)
let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)
let query = HKSampleQuery(sampleType: sleepType, predicate: predicate, limit: 30, sortDescriptors: [sortDescriptor]) (query, tmpResult, error) -> Void in
if let result = tmpResult
for item in result
if let sample = item as? HKCategorySample
let value = (sample.value == HKCategoryValueSleepAnalysis.InBed.rawValue) ? "InBed" : "Asleep"
print("sleep: \(sample.startDate) \(sample.endDate) - source: \(sample.source.name) - value: \(value)")
let seconds = sample.endDate.timeIntervalSinceDate(sample.startDate)
let minutes = seconds/60
let hours = minutes/60
healthStore.executeQuery(query)
我从http://benoitpasquier.fr/sleep-healthkit/总结了这个。
【讨论】:
以上是关于查询 HKCategoryTypeIdentifierSleepAnalysis 的 HealthKit的主要内容,如果未能解决你的问题,请参考以下文章
数据库查询: 列出表的所有字段,“*”符号,查询指定字段数据,DISTINCT查询,IN查询,BETWEEN AND查询,LIKE模糊查询,对查询结果排序,分组查询,统计分组查询