一天的谓词格式,用于搜索从 HealthKit 检索的 Steps Sample Array

Posted

技术标签:

【中文标题】一天的谓词格式,用于搜索从 HealthKit 检索的 Steps Sample Array【英文标题】:Predicate format, for a single day, to search Steps Sample Array retrieved from HealthKit 【发布时间】:2020-07-30 13:41:47 【问题描述】:

我想要从 HealthKit 检索到的步数数据中的每日总步数。数据在一个数组中,我尝试了以下搜索谓词,但没有一个与 healthkit 中显示的数据匹配。

我首先使用一个简单的查询来获取所有数据。然后我想使用谓词搜索数组。

我尝试过的谓词是……

NSPredicate *daySearchPredicate = [NSPredicate predicateWithFormat:@"startDate>=%@ && startDate<%@ && endDate>=%@ && endDate<%@",historyDate,nextDate,historyDate,nextDate];
NSPredicate *daySearchPredicate = [NSPredicate predicateWithFormat:@"startDate>=%@ && startDate<%@",historyDate,nextDate];
NSPredicate *daySearchPredicate = [HKQuery predicateForSamplesWithStartDate:historyDate endDate:nextDate options:HKQueryOptionStrictEndDate];
NSPredicate *daySearchPredicate = [NSPredicate predicateWithFormat:@"startDate=%@",historyDate];

我希望我的应用中的数据与健康应用数据相匹配。

请帮忙。我想要目标 C 代码。我不懂斯威夫特。

【问题讨论】:

【参考方案1】:

我猜HKStatisticsCollectionQuery 会更适合您的要求,因为它支持以特定间隔进行多天查询。 来自HKStatisticsCollectionQuery 文档。

在一系列固定长度的时间间隔内执行多个统计查询并返回结果的查询。

很抱歉,没有快速设置来发布Objective-C 示例代码 sn-p。上述文档应该有一个Objc 示例供您使用。我想你应该没有任何问题来转换下面的。

let queryDateStart = Calendar.current.startOfDay(for: Calendar.current.date(byAdding: DateComponents(day: -6), to: Date())!)
let queryDateEnd = Calendar.current.date(byAdding: DateComponents(day: 7), to: queryDateStart)!
let predicate = HKStatisticsCollectionQuery.predicateForSamples(withStart: queryDateStart, end: queryDateEnd, options:[])
guard let quantityType = HKObjectType.quantityType(forIdentifier: .stepCount) else 
    return // Step Count not available

        
let query = HKStatisticsCollectionQuery(quantityType: quantityType,
                             quantitySamplePredicate: predicate,
                                             options: .cumulativeSum,
                                          anchorDate: Date(timeIntervalSince1970: 0), // Anchor point is mid night
                                  intervalComponents: DateComponents(day: 1))

query.initialResultsHandler =  query, results, error in
     results?.enumerateStatistics(from: queryDateStart, to: queryDateEnd, with:  (result, stop) in
          let stepCount = Int(result.sumQuantity()!.doubleValue(for: HKUnit.count()))
                print("Start: \(result.startDate), end: \(result.endDate) => stepCount: \(stepCount)")
     )


HKHealthStore().execute(query)

【讨论】:

我没有使用统计查询。相反,我正在运行一个简单的 HKSampleQuery 并获取所有示例数据。我的代码主要是围绕它编写的。现在我只想获取这些样本,这些样本的总步数将与给定日期的健康应用程序相匹配。你能给我一个匹配的谓词吗?例如,我如何在谓词中包含时间。即给定日期的 00:00:00 到 23:59:59。我应该做的工作。

以上是关于一天的谓词格式,用于搜索从 HealthKit 检索的 Steps Sample Array的主要内容,如果未能解决你的问题,请参考以下文章

谓词中的 HKQueryOptions

如何使用 HealthKit 从特定日期准确获取 24 小时的睡眠数据?

如何使用 HealthKit 从特定日期准确获取 24 小时的睡眠数据?

Xamarin iOS 从 HealthKit 读取步数

Xamarin iOS 从 HealthKit 读取步数

Swift - nextDate()按年搜索