如何按日期获取 Apple 健康数据?
Posted
技术标签:
【中文标题】如何按日期获取 Apple 健康数据?【英文标题】:How to get Apple health data by date wise? 【发布时间】:2018-05-31 09:06:05 【问题描述】:Apple 健康应用程序按日期提供数据,如下图所示。
通过使用HealthKit
,我正在从 Apple Health 获取步数数据
作为
let p1 = HKQuery.predicateForSamples(withStart: fromDate, end: Date(), options: .strictStartDate)
let p2 = HKQuery.predicateForObjects(withMetadataKey: HKMetadataKeyWasUserEntered, operatorType: .notEqualTo, value: true)
let timeSortDesriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)//as in health kit entry
let quantityType = HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!
let predicate = HKQuery.predicateForSamples(withStart: fromDate, end: Date(), options: .strictStartDate)
let sourceQuery = HKSourceQuery(sampleType: quantityType, samplePredicate: predicate, completionHandler: query,sources,error in
if sources?.count != 0 && sources != nil
let lastIndex = sources!.count - 1
var sourcesArray = Array(sources!)
for i in 0..<sourcesArray.count
let sourcePredicate = HKQuery.predicateForObjects(from: sourcesArray[i])
let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [p1, p2,sourcePredicate])
let query = HKSampleQuery(sampleType: quantityType, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: [timeSortDesriptor], resultsHandler: query, results, error in
guard let samples = results as? [HKQuantitySample] else
return
......
sourceQuery 提供多个对象,例如 Apple watch、My iPhone。
此外,我正在使用带有HKSampleQuery
的 for 循环,它给出了HKQuantitySample
对象。
问题是[HKQuantitySample]
给出了未按日期排序的步骤数据数组。
我正在寻找日期俱乐部的数据,例如健康应用程序中的苹果健康显示。
是的,有一种解决方法,例如按日期手动对 [HKQuantitySample]
中的数据进行排序。但可能有使用predicates
或其他方法的解决方法。如果您需要任何额外信息,请随时询问。
编辑:正如@Allan 所建议的 我添加了HKStatisticsCollectionQuery,是的,它提供了数据datewise,但接收的步数与 Apple 健康应用程序中的不同。下面的代码需要添加/修改吗?
let last10Day = Calendar.current.date(byAdding: .day, value: -10, to: Date())!
var interval = DateComponents()
interval.day = 1
let quantityType1 = HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!
// Create the query
let query = HKStatisticsCollectionQuery(quantityType: quantityType1,
quantitySamplePredicate: nil,
options: .cumulativeSum,
anchorDate: last10Day,
intervalComponents: interval)
// Set the results handler
query.initialResultsHandler =
query, results, error in
guard let statsCollection = results else
// Perform proper error handling here
fatalError("*** An error occurred while calculating the statistics: \(String(describing: error?.localizedDescription)) ***")
let endDate = Date()
statsCollection.enumerateStatistics(from: last10Day, to: endDate, with: (statistics, stop) in
if let quantity = statistics.sumQuantity()
let date = statistics.startDate
let value = quantity.doubleValue(for: HKUnit.count())
print("--value-->",value, ",--For Date-->",date)
)
healthStore.execute(query)
【问题讨论】:
【参考方案1】:使用HKStatisticsCollectionQuery
获取某个时期的数据。以下示例展示了如何获取过去 30 天的步数:
private let healthStore = HKHealthStore()
private let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!
func importStepsHistory()
let now = Date()
let startDate = Calendar.current.date(byAdding: .day, value: -30, to: now)!
var interval = DateComponents()
interval.day = 1
var anchorComponents = Calendar.current.dateComponents([.day, .month, .year], from: now)
anchorComponents.hour = 0
let anchorDate = Calendar.current.date(from: anchorComponents)!
let query = HKStatisticsCollectionQuery(
quantityType: stepsQuantityType,
quantitySamplePredicate: nil,
options: [.cumulativeSum],
anchorDate: anchorDate,
intervalComponents: interval
)
query.initialResultsHandler = _, results, error in
guard let results = results else
log.error("Error returned form resultHandler = \(String(describing: error?.localizedDescription))")
return
results.enumerateStatistics(from: startDate, to: now) statistics, _ in
if let sum = statistics.sumQuantity()
let steps = sum.doubleValue(for: HKUnit.count())
print("Amount of steps: \(steps), date: \(statistics.startDate)")
healthStore.execute(query)
【讨论】:
何塞你是 BOSS ? 节省了一天!【参考方案2】:如果您希望像在“健康”应用中那样按天分隔步数,您应该使用HKStatisticsCollectionQuery
,而不是HKSampleQuery
。 documentation 提供了按周分组结果的示例代码,但您可以改为按天分组修改它。
【讨论】:
以上是关于如何按日期获取 Apple 健康数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 bigquery 中使用 rowid 按日期获取数据集的第一个值,并将给定日期的所有其他值设为 0