查询 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模糊查询,对查询结果排序,分组查询,统计分组查询

MySQL查询(简单查询,条件查询,排序查询)

高级查询(嵌套查询)和(相关子查询)

Elasticsearch中的Term查询和全文查询

Elasticsearch中的Term查询和全文查询